2011-01-31 3 views
52
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) 

Ahora tengo un script que ejecuto. Cuando lo ejecuto y llega a esta línea, comienza a imprimir cosas porque run.sh tiene impresiones en él.¿Cómo canalizo una llamada de subproceso a un archivo de texto?

¿Cómo puedo canalizar esto también a un archivo de texto? (Y también imprimir, si es posible)

Respuesta

93

Si desea escribir la salida en un archivo, puede usar el argumento stdout de subprocess.call.

Se necesitan None, subprocess.PIPE, un objeto de archivo o un descriptor de archivo. El primero es el predeterminado, stdout se hereda del padre (su script). El segundo le permite pasar de un comando/proceso a otro. El tercero y el cuarto son lo que quiere, para tener el resultado escrito en un archivo.

Necesitas abrir un archivo con algo como open y pasar el objeto o el archivo descriptor de número entero a call:

f = open("blah.txt", "w") 
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) 

supongo cualquier objeto de fichero válido funcionaría, como una toma de corriente (jadeo :)), pero nunca lo intenté.

Como marcog menciona en los comentarios que es posible que desee redirigir también a stderr, puede redirigirlo a la misma ubicación que stdout con stderr=subprocess.STDOUT. Cualquiera de los valores mencionados anteriormente también funciona, puede redireccionar a diferentes lugares.

+1

Sí, el trabajo de socket también. – ocodo

+1

¿Por qué no funciona subprocess.call (["echo", "1", ">>", "t.txt"])? – Goldname

+2

@Goldname necesita un shell para hacer la redirección, entonces: 'subprocess.call ([" echo "," 1 "," >> "," t.txt "], shell = True)' debería funcionar. –

16

Las opciones para popen se pueden utilizar en call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0 

Entonces ...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput) 

entonces usted puede hacer lo que quiera con myoutput (que necesitaría ser un archivo por cierto).

Además, puede hacer algo más parecido a una salida por cable como esta.

dmesg | grep hda 

sería:

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

Hay un montón de información preciosa, útil en la python manual page.

Cuestiones relacionadas