Si je fais ce qui suit :
import subprocess
from cStringIO import StringIO
subprocess.Popen(['grep','f'],stdout=subprocess.PIPE,stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
J'ai compris :
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 533, in __init__
(p2cread, p2cwrite,
File "/build/toolchain/mac32/python-2.4.3/lib/python2.4/subprocess.py", line 830, in _get_handles
p2cread = stdin.fileno()
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
Apparemment, un objet cStringIO.StringIO n'est pas assez proche d'un canard de fichier pour convenir à subprocess.Popen. Comment puis-je contourner ce problème ?
3 votes
Au lieu de contester ma réponse en la supprimant, je l'ajoute en commentaire... Lecture recommandée : L'article du blog de Doug Hellmann sur le module Python de la semaine concernant le sous-processus. .
3 votes
Le billet de blog contient de multiples erreurs, par exemple, le tout premier exemple de code :
call(['ls', '-1'], shell=True)
est incorrect. Je vous recommande de lire questions communes de la description du tag "subprocess à la place. En particulier, Pourquoi subprocess.Popen ne fonctionne pas lorsque args est une séquence ? explique pourquoicall(['ls', '-1'], shell=True)
est erronée. Je me souviens avoir laissé des commentaires sous l'article du blog, mais je ne les vois plus maintenant pour une raison quelconque.2 votes
Pour les plus récents
subprocess.run
voir stackoverflow.com/questions/48752152/