Escribe el resultado de la función en stdin

Estoy tratando de escribir los resultados de una función para stdin.

Este es el código:

def testy(): return 'Testy !' import sys sys.stdin.write(testy()) 

Y el error que me sale es:

 Traceback (most recent call last): File "stdin_test2.py", line 7, in  sys.stdin.write(testy()) io.UnsupportedOperation: not writable 

No estoy completamente seguro, ¿es esta la manera correcta de hacer las cosas?

¿Podría burlarse de stdin con un objeto similar a un archivo?

 import sys import StringIO oldstdin = sys.stdin sys.stdin = StringIO.StringIO('asdlkj') print raw_input('.') # .asdlkj 

stdin es un flujo de entrada, no un flujo de salida. No puedes escribirle.

Lo que podría hacer, posiblemente, es crear una tubería usando os.pipe , convertir el extremo legible en un objeto de archivo usando os.fdopen , y reemplazar stdin con eso, y luego escribir en el extremo escribible.

 r, w = os.pipe() new_stdin = os.fdopen(r, 'r') old_stdin, sys.stdin = sys.stdin, new_stdin 

Aunque no puedo ver bien ese final. Será más fácil y menos propenso a errores simplemente reescribir las partes de la aplicación que están utilizando la input .

Estaba buscando en Google cómo hacer esto yo mismo y lo descubrí. Para mi situación, tomé una muestra de entrada de hackerrank.com y la puse en un archivo, luego quise poder usar dicho archivo como mi STDIN, de modo que pudiera escribir una solución que pudiera copiarse y pegarse fácilmente en su IDE. . Hice mis 2 archivos de python ejecutables, agregué el shebang. El primero lee mi archivo y escribe en STDOUT.

 #!/Users/ryandines/.local/share/virtualenvs/PythonPractice-U9gvG0nO/bin/python # my_input.py import sys def read_input(): lines = [line.rstrip('\n') for line in open('/Users/ryandines/Projects/PythonPractice/swfdump')] for my_line in lines: sys.stdout.write(my_line) sys.stdout.write("\n") read_input() 

El segundo archivo es el código que estoy escribiendo para resolver un desafío de progtwigción. Esto fue mío:

 #!/Users/ryandines/.local/share/virtualenvs/PythonPractice-U9gvG0nO/bin/python def zip_stuff(): n, x = map(int, input().split(' ')) sheet = [] for _ in range(x): sheet.append( map(float, input().split(' ')) ) for i in zip(*sheet): print( sum(i)/len(i) ) zip_stuff() 

Luego uso el comando pipe del sistema operativo para proporcionar el almacenamiento en búfer de STDIN. Funciona exactamente igual que hackerrank.com, por lo que puedo cortar / pegar fácilmente la entrada de muestra y también mi código correspondiente sin cambiar nada. Llámalo así: ./my_input.py | ./zip_stuff.py ./my_input.py | ./zip_stuff.py