Uso de Python para ejecutar el ejecutable y completar la entrada del usuario

Estoy tratando de usar Python para automatizar un proceso que implica llamar a un ejecutable de Fortran y enviar algunas entradas de usuario. He pasado algunas horas leyendo preguntas similares e intentando diferentes cosas, pero no he tenido suerte. Aquí hay un ejemplo mínimo para mostrar lo que probé el último

#!/usr/bin/python import subprocess # Calling executable ps = subprocess.Popen('fortranExecutable',shell=True,stdin=subprocess.PIPE) ps.communicate('argument 1') ps.communicate('argument 2') 

Sin embargo, cuando bash ejecutar esto, aparece el siguiente error:

  File "gridGen.py", line 216, in  ps.communicate(outputName) File "/opt/apps/python/epd/7.2.2/lib/python2.7/subprocess.py", line 737, in communicate self.stdin.write(input) ValueError: I/O operation on closed file 

Cualquier sugerencia o punteros son muy apreciados.

EDITAR:

Cuando llamo al ejecutable de Fortran, solicita la entrada del usuario de la siguiente manera:

 fortranExecutable Enter name of input file: 'this is where I want to put argument 1' Enter name of output file: 'this is where I want to put argument 2' 

De alguna manera, necesito ejecutar el ejecutable, esperar hasta que solicite la entrada del usuario y luego proporcionar esa entrada.

Si la entrada no depende de las respuestas anteriores, puede pasarlas todas a la vez usando .communicate() :

 import os from subprocess import Popen, PIPE p = Popen('fortranExecutable', stdin=PIPE) #NOTE: no shell=True here p.communicate(os.linesep.join(["input 1", "input 2"])) 

.communicate() espera a que finalice el proceso, por lo que puede llamar a lo sumo una vez.

Como dice la especificación, se communicate() a que finalice el subproceso, así la segunda llamada se dirigirá al proceso terminado.

Si desea interactuar con el proceso, use p.stdin & Co en su lugar ( p.stdin en cuenta la advertencia de interlocking).

Cuando llegue a ps.communicate (‘argumento 2’), el proceso ps ya está cerrado y ps.communicate (‘argumento 1’) espera hasta EOF. Creo que, si quieres escribir varias veces en stdin, deberías usar:

 ps.stdin.write('argument 1') ps.stdin.write('argument 2') 

Sus argumentos no deben ser pasados ​​para comunicarse. deben darse en la llamada a Popen, como: http://docs.python.org/2/library/subprocess.html#subprocess.Popen

 >>> import shlex, subprocess >>> command_line = raw_input() /bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'" >>> args = shlex.split(command_line) >>> print args ['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"] >>> p = subprocess.Popen(args) # Success!