2009-05-19 9 views

Répondre

23

Vous pouvez rediriger directement vers un fichier en utilisant le sous-processus.

import subprocess 
with open('output.txt', 'w') as output_f: 
    p = subprocess.Popen('Text/to/execute with-arg', 
         stdout=output_f, 
         stderr=output_f) 
7

Le plus simple est os.system("the.exe -a >thefile.txt"), mais il existe de nombreuses autres manières, par exemple avec le module subprocess dans la bibliothèque standard.

+0

comment utiliser ce sous-processus? – Kim

+0

Voir http://docs.python.org/library/subprocess.html#replacing-os-system. –

+3

Rappelez-vous que le symbole de pipe diffère entre les systèmes d'exploitation lorsque vous essayez d'utiliser os.system pour rediriger les choses ... – mavnn

3

Vous pouvez faire quelque chose comme ceci par exemple. lire la sortie de ls -l (ou toute autre commande)

p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE) 
print p.stdout.read() # or put it in a file 

vous pouvez faire des choses similaires pour stderr/stdin

mais comme Alex dit si vous voulez juste dans un fichier, il suffit de rediriger le cmd sortie dans un fichier

+0

Si c'est un processus long, sachez que stdout.read() bloque. Vous devrez exécuter le sous-processus sur un thread différent si le script continue à faire autre chose ou répondre à la sortie 'live'. – mavnn

0

Si vous voulez simplement exécuter l'exécutable et attendre les résultats, la solution d'Anurag est probablement la meilleure. J'avais besoin de répondre à chaque ligne de sortie à son arrivée, et j'ai trouvé ce qui suit:

1) Créer un objet avec une méthode d'écriture (texte). Redirige stdout vers celui-ci (sys.stdout = obj). Dans votre méthode d'écriture, traitez la sortie comme elle arrive.

2) Exécuter une méthode dans un fil séparé avec quelque chose comme le code suivant: Parce que vous avez redirigé stdout

p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, shell=False) 
    while p.poll() is None: 
     print p.stdout.readline().strip() 

, PIPE envoyer la sortie à votre méthode d'écriture ligne par ligne. Si vous n'êtes pas certain que vous allez obtenir des sauts de ligne, lire (montant) fonctionne aussi, je crois.

3) Rappelez-vous de rediriger stdout par défaut: sys.stdout = __sys.stdout__

0

Bien que le titre (.exe) semble être un problème sous Windows. Je devais partager que la réponse acceptée (subprocess.Popen() avec les arguments stdout/stderr) ne fonctionnait pas pour Mac OS X (10.8) avec python 2.7.

J'ai dû utiliser subprocess.check_output() (python 2.7 et supérieur) pour le faire fonctionner. Exemple:

import subprocess 

cmd = 'ls -l' 
out = subprocess.check_output(cmd, shell=True) 
with open('my.log', 'w') as f: 
    f.writelines(out) 
    f.close() 

Notez que cette solution écrit toute la sortie accumulée lorsque le programme se termine. Si vous souhaitez surveiller le fichier journal pendant l'exécution. Vous voudrez peut-être essayer autre chose. Dans mon cas, je me suis seulement préoccupé du résultat final.

Questions connexes