web-dev-qa-db-fra.com

Comment diriger un appel de sous-processus vers un fichier texte?

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

J'ai maintenant un script que je lance. Lorsque je l'exécute et que cette ligne apparaît, elle commence à imprimer parce que run.sh contient des impressions.

Comment puis-je diriger ceci vers un fichier texte également? (Et aussi imprimer, si possible)

72
TIMEX

Si vous voulez écrire la sortie dans un fichier, vous pouvez utiliser l'argument stdout - de subprocess.call.

Il faut None, subprocess.PIPE, un objet fichier ou un descripteur de fichier. Le premier est la valeur par défaut, stdout est hérité du parent (votre script). La seconde vous permet de diriger d’une commande/processus à un autre. Les troisième et quatrième sont ce que vous voulez, pour que la sortie soit écrite dans un fichier.

Vous devez ouvrir un fichier avec quelque chose comme open et transmettre l'entier ou le descripteur de fichier entier à call:

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

Je devine que tout objet valide ressemblant à un fichier fonctionnerait, comme un socket (gasp :)), mais je n'ai jamais essayé.

Comme marcog mentionne dans les commentaires que vous pourriez également vouloir rediriger stderr, vous pouvez le rediriger vers le même emplacement que stdout avec stderr=subprocess.STDOUT. N'importe laquelle des valeurs mentionnées ci-dessus fonctionne également, vous pouvez rediriger vers différents endroits.

128
Skurmedel

Les options pour popen peuvent être utilisées dans 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

Alors...

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

Ensuite, vous pouvez faire ce que vous voulez avec myoutput (qui devrait être un fichier btw).

En outre, vous pouvez faire quelque chose de plus proche d'une sortie canalisée comme celle-ci.

dmesg | grep hda

serait:

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

Il y a plein de belles informations utiles sur page de manuel python .

16
ocodo