Maison >développement back-end >Tutoriel Python >Comment transmettre correctement des chaînes à « subprocess.Popen » via stdin ?

Comment transmettre correctement des chaînes à « subprocess.Popen » via stdin ?

DDD
DDDoriginal
2024-12-05 09:54:12561parcourir

How to Correctly Pass Strings to `subprocess.Popen` via stdin?

Passer des chaînes à subprocess.Popen via stdin

Problème

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]

Error

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'

Solution

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

Exemple

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
# ->

Solution Python 3.5

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!

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