Maison >développement back-end >Tutoriel Python >Comment transmettre correctement des chaînes à « subprocess.Popen » via stdin ?
Tentative d'utiliser StringIO avec subprocess.Popen pour stdin entraîne un AttributeError.
import subprocess from cStringIO import StringIO subprocess.Popen(['grep', 'f'], stdout=subprocess.PIPE, stdin=StringIO('one\ntwo\nthree\nfour\nfive\nsix\n')).communicate()[0]
Traceback met en évidence l'incompatibilité de cStringIO.StringIO avec la méthode fileno() requise par subprocess.Popen.
AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'
La documentation subprocess.Popen nécessite l'utilisation de stdin=PIPE pour la transmission des données vers stdin. La syntaxe de remplacement os.popen() est recommandée :
pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin
Adaptation du code d'origine :
from subprocess import Popen, PIPE, STDOUT p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0] print(grep_stdout.decode()) # -> four # -> five # ->
Pour Python 3.5 :
#!/usr/bin/env python3 from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) # -> 0 print(p.stdout) # -> four # -> five # ->
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!