Maison >développement back-end >Tutoriel Python >Comment puis-je diriger une chaîne vers le stdin de subprocess.Popen ?
Comment canaliser une chaîne dans subprocess.Popen via l'argument Stdin
La fonction subprocess.Popen permet aux scripts Python de générer de nouveaux processus et interagir avec leurs entrées, sorties et erreurs standard. Un cas d'utilisation courant consiste à transmettre des données au processus enfant via son stdin, ce qui peut être réalisé en spécifiant stdin=PIPE lors de la création de l'objet.
Cependant, tenter d'utiliser un objet cStringIO.StringIO comme flux stdin entraîne une erreur, car il lui manque l'attribut fileno attendu par subprocess.Popen. Pour résoudre ce problème, utilisez les techniques suivantes :
Utilisation de Popen.communicate()
Selon la documentation officielle, Popen.communicate() s'attend à ce que les données soient transmises via le paramètre d'entrée, plutôt que le flux stdin. Modifiez votre code pour :
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())
À l'aide de subprocess.run (Python 3.5)
Pour les versions Python 3.5 et supérieures, subprocess.run fournit un moyen simplifié de gérer sous-processus. Il vous permet de transmettre une entrée de chaîne et d'obtenir une sortie de chaîne en un seul appel de fonction :
#!/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) print(p.stdout)
En adoptant ces approches, vous pouvez efficacement transmettre une chaîne dans subprocess.Popen via l'argument stdin, permettant à vos programmes de interagir de manière transparente avec les processus externes.
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!