2010-10-20 15 views
11

Nel mio codice ho una linea simile a questa:in Python scripting, come faccio a catturare l'output da subprocess.call a un file

rval = subprocess.call(["mkdir",directoryName], shell=True) 

e posso controllare rval per vedere se è 0 o 1 , ma se è 1, mi piacerebbe avere il testo dal comando "A subdirectory or file ben already exists." in un formato di file, quindi posso confrontarlo con un altro file se voglio assicurarmi che il testo sia lo stesso.

E 'possibile avere una linea come questa, ma so che questo non funziona

rval = subprocess.call(["mkdir",directoryName], shell=True) >> filename 

quindi non importa quello che succede con il comando, il testo viene catturato in filename, e rval ha ancora il ritorno codice?

+0

Duplicato di tutti questi: http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+capture –

+0

possibile duplicato di [Acquisizione dell'elaborazione di sottoprocesso] (http://stackoverflow.com/questions/ 2525263/capture -subprocess-output) –

+0

perché non stai usando 'mkdir()' di Python? – ghostdog74

risposta

12
import subprocess 
f = open(r'c:\temp\temp.txt','w') 
subprocess.call(['dir', r'c:\temp'], shell=True, stdout=f) 
f.close() 
+0

Grazie, funziona. – Dag

+1

Qualsiasi motivo per cui hai usato "shell = True" in questo caso? Perché l'ho letto è una cattiva idea (almeno su * nix). – user225312

+0

@PulpFiction, due motivi: in primo luogo è stato incluso nella domanda originale, in secondo luogo stavo usando un comando shell di Windows per il test. –

12

Il modulo sottoprocesso ha costruito in funzione di 'check_output' per fare questo:

In [11]: result = subprocess.check_output(['pwd']) 

In [12]: print result 
/home/vagrant 
+0

Ma poi hai perso il valore di uscita :( – speg

+1

Quando ho bisogno di entrambi, uso il pacchetto di envoy: https://github.com/kennethreitz/envoy – btubbs

+3

Nota che check_output è possibile solo dal 2.7 – Doomsday

8
import subprocess 

try: 
    result = subprocess.check_output(['dir', r'c:\temp'], shell=True) 
    print result 
except subprocess.CalledProcessError as e: 
    return_code = e.returncode 

È comunque necessario utilizzare try cattura perché genera un'eccezione se il codice di ritorno è diverso da zero:)

+1

Sarebbe più semplice usare 'except CalledProcessError come e: returncode = e.returncode'. – orodbhen

Problemi correlati