Pour plus de commodité, Python 2.7 fournit l'
subprocess.check_output(*popenargs, **kwargs)
la fonction, qui prend les mêmes arguments que Popen, mais renvoie une chaîne contenant le programme de la sortie. Vous pouvez transmettre stderr=subprocess.STDOUT
afin d'assurer que les messages d'erreur sont inclus dans les résultats retournés -- mais ne passe pas stderr=subprocess.PIPE
, ce qui peut provoquer des blocages. Voir ici pour plus d'.
Si vous utilisez une ancienne python, Vartec de la méthode de travail. Mais la meilleure façon d'aller-au moins dans les cas les plus simples qui ne nécessitent pas une sortie en temps réel de capture, est d'utiliser communicate
. Comme dans:
output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0]
Ou
>>> import subprocess
>>> p = subprocess.Popen(['ls', '-a'], stdout=subprocess.PIPE,
... stderr=subprocess.PIPE)
>>> out, err = p.communicate()
>>> print out
.
..
foo
Si vous définissez stdin=PIPE
, communicate
vous permet aussi de passer des données à traiter par le biais d' stdin
:
>>> cmd = ['awk', 'length($0) > 5']
>>> p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
... stderr=subprocess.PIPE,
... stdin=subprocess.PIPE)
>>> out, err = p.communicate('foo\nfoofoo\n')
>>> print out
foofoo
Enfin, notez Aaron Hall de réponse, ce qui indique que sur certains systèmes, vous devez configurer stdout
, stderr
, et stdin
tous PIPE
(ou DEVNULL
) pour obtenir de l' communicate
à travailler à tous.