Maison >développement back-end >Tutoriel Python >Comment puis-je diriger une chaîne vers le stdin de subprocess.Popen ?

Comment puis-je diriger une chaîne vers le stdin de subprocess.Popen ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-08 18:31:10505parcourir

How Can I Pipe a String to subprocess.Popen's stdin?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn