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

In questo momento ho uno script che ho eseguito. Quando lo eseguo e colpisce questa linea, inizia a stampare cose perché run.sh ha delle stampe al suo interno.Come convogliare una chiamata di sottoprocesso in un file di testo?

Come si canalizza anche questo in un file di testo? (E anche stampare, se possibile)

risposta

93

Se si desidera scrivere l'output su un file, è possibile utilizzare lo strumento stdout di subprocess.call.

Prende None, subprocess.PIPE, un oggetto file o di un descrittore di file. Il primo è il default, lo stdout è ereditato dal genitore (il tuo script). Il secondo consente di passare da un comando/processo all'altro. Il terzo e il quarto sono quelli che vuoi, per avere l'output scritto su un file.

è necessario aprire un file con qualcosa come open e passare l'oggetto o il descrittore di file intero a call:

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

sto cercando di indovinare qualsiasi oggetto simile a file valido avrebbe funzionato, come una presa di corrente (gasp :)), ma non ho mai provato.

Come marcog menzioni nei commenti si potrebbe voler reindirizzare anche lo stderr, è possibile reindirizzare questo nella stessa posizione come stdout con stderr=subprocess.STDOUT. Anche uno dei valori sopra menzionati funziona, è possibile reindirizzare a luoghi diversi.

+1

Sì, anche le prese di corrente. – ocodo

+1

perché il subprocess.call (["echo", "1", ">>", "t.txt"]) funziona? – Goldname

+2

@ Nome in grassetto è necessaria una shell per eseguire il reindirizzamento, quindi: 'subprocess.call ([" echo "," 1 "," >> "," t.txt "], shell = True)" dovrebbe funzionare. –

16

Le opzioni per popen possono essere utilizzate in 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 

Quindi ...

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

allora si può fare ciò che vuoi con myoutput (che dovrebbe essere un file btw).

Inoltre, si può fare qualcosa di più vicino ad un'uscita in filodiffusione come questo.

dmesg | grep hda 

sarebbe:

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

C'è un sacco di bella, informazioni utili sulla python manual page.

Problemi correlati