Passer une entrée de chaîne à subprocess.Popen
L'erreur rencontrée lors de la tentative de transmission d'un objet StringIO en tant que stdin à subprocess.Popen révèle que StringIO les objets ne sont pas reconnus comme des objets de type fichier valides par le sous-processus. Pour résoudre ce problème et réussir à transmettre une chaîne en tant que stdin, il est nécessaire de créer d'abord un pipeline vers le processus Popen.
Utilisation de la création explicite de pipeline
Le sous-processus. La documentation communicate() suggère de créer un pipeline avec stdin=PIPE pour envoyer des données au stdin du processus. Ceci peut être réalisé en modifiant le code comme suit :
import subprocess 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())
Ce code crée un canal vers le processus grep, permettant à la chaîne d'entrée d'être transmise via l'argument stdin.
Utilisation de subprocess.run (Python 3.5)
Pour les versions Python 3.5 et supérieures, subprocess.run peut être utilisé pour transmettre l'entrée sous forme de chaîne et récupérer la sortie sous forme de chaîne en un seul appel :
#!/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)
Cette approche fournit une alternative concise à la méthode de création de pipeline explicite.
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!