Comment puis-je obtenir la sortie d'un processus exécuté à l'aide de subprocess.call()
?
Passage d'un StringIO.StringIO
à l'objet stdout
donne cette erreur :
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 444, in call
return Popen(*popenargs, **kwargs).wait()
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 588, in __init__
errread, errwrite) = self._get_handles(stdin, stdout, stderr)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/subprocess.py", line 945, in _get_handles
c2pwrite = stdout.fileno()
AttributeError: StringIO instance has no attribute 'fileno'
>>>
2 votes
La réponse de Mike est correcte. Notez que
StringIO
fonctionne comme un fichier dans la plupart des cas mais pas tous. Cela ne fonctionne pas dans votre cas parce que lamultiprocessing
suppose des fichiers réels dans certains cas. Ceci a peut-être été corrigé : voir bugs.python.org/issue5313 pour un bogue connexe.0 votes
En fait,
communicate()
utiliseselect.select()
qui n'accepte que les descripteurs de fichiers, ce n'est donc pas vraiment un bogue. J'étais assez confus par ce problème lorsque je l'ai rencontré pour la première fois et l'exploration des profondeurs de subprocess.py m'a beaucoup appris !1 votes
Je pense
subprocess.run
rend cela plus simple, à partir de Python 3.5. J'ajouterai une réponse quand j'en aurai l'occasion.1 votes
Notez que la réponse acceptée est largement obsolète. La réponse simple pour Python 2.7 serait
subprocess.check_output()
; en Python 3.5+, vous voudrez également consulter les éléments suivantssubprocess.run()
. Il ne devrait pas y avoir de besoin ou de volonté d'utiliser des produits bruts.subprocess.Popen()
si vous pouvez l'éviter, bien que certains cas d'utilisation plus complexes l'exigent (et vous devez alors réaliser vous-même la plomberie nécessaire). Le site Stack Overflowsubprocess
page d'information sur les tags propose quelques bonnes ressources pour les cas moins triviaux.