python subprocess stdin nuke

¿Cómo escribo en un subproceso de Python ''stdin?



subprocess nuke (2)

Intento escribir un script de Python que inicie un subproceso y escriba en el stdin del subproceso. También me gustaría poder determinar una acción que se tomará si el subproceso falla.

El proceso que estoy tratando de iniciar es un programa llamado nuke que tiene su propia versión incorporada de Python a la que me gustaría poder enviar comandos, y luego le digo que se cierre después de que se ejecutan los comandos. Hasta ahora he resuelto que si inicio Python en el símbolo del sistema como y luego comienzo nuke como un subproceso, entonces puedo escribir los comandos para nuke , pero me gustaría poder poner todo esto en una secuencia de comandos para que el programa principal de Python puede iniciar nuke y luego escribir en su entrada estándar (y por lo tanto en su versión incorporada de Python) y decirle que haga cosas elegantes, así que escribí un script que comienza de la siguiente manera:

subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])

Entonces no pasa nada porque nuke está esperando la entrada del usuario. ¿Cómo escribiría ahora en la entrada estándar?

Estoy haciendo esto porque estoy ejecutando un plugin con nuke que hace que se bloquee intermitentemente al renderizar varios fotogramas. Así que me gustaría que este script pueda comenzar con nuke , dígale que haga algo y luego, si falla, vuelva a intentarlo. Entonces, si hay una forma de atrapar un choque y seguir estando bien, sería fantástico.


Puede proporcionar un objeto similar a un archivo al argumento stdin de subprocess.call() .

La documentation para el objeto Popen aplica aquí.

Para capturar el resultado, en su lugar debe usar subprocess.check_output() , que toma argumentos similares. De la documentación:

>>> subprocess.check_output( ... "ls non_existent_file; exit 0", ... stderr=subprocess.STDOUT, ... shell=True) ''ls: non_existent_file: No such file or directory/n''


Puede ser mejor usar communicate :

from subprocess import Popen, PIPE, STDOUT p = Popen([''myapp''], stdout=PIPE, stdin=PIPE, stderr=PIPE) stdout_data = p.communicate(input=''data_to_write'')[0]

"Mejor", debido a esta advertencia:

Utilice communica () en lugar de .stdin.write, .stdout.read o .stderr.read para evitar bloqueos debido a que cualquiera de los demás búferes de canal del SO se llenan y bloquean el proceso secundario.