Passer une entrée de chaîne à Subprocess.Popen via Stdin
Problème :
Passer une chaîne dans l'argument stdin de subprocess.Popen à l'aide d'un objet cStringIO.StringIO entraîne une erreur, car le l'objet ne dispose pas de l'attribut fileno nécessaire.
Solution :
Pour résoudre ce problème, il est recommandé d'utiliser l'approche plus simple décrite dans la documentation Popen.communicate() . En définissant stdin=PIPE, vous pouvez créer un canal pour stdin et fournir l'entrée de chaîne directement à la méthode de communication.
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()) # Output: # -> four # -> five # ->
Remarque supplémentaire :
Pour Python 3.5 (3.6 pour l'encodage), subprocess.run simplifie le processus en vous permettant de transmettre une entrée de chaîne et de récupérer la sortie sous forme de chaîne en un seul clic. appeler.
from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) # Output: # -> 0 print(p.stdout) # Output: # -> 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!