Heim >Backend-Entwicklung >Python-Tutorial >Wie übergebe ich Strings über stdin korrekt an „subprocess.Popen'?

Wie übergebe ich Strings über stdin korrekt an „subprocess.Popen'?

DDD
DDDOriginal
2024-12-05 09:54:12556Durchsuche

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

Übergabe von Strings an subprocess.Popen über stdin

Problem

Der Versuch, StringIO mit subprocess.Popen für stdin zu verwenden, führt zu einem 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]

Fehler

Traceback hebt das hervor Inkompatibilität von cStringIO.StringIO mit der von subprocess.Popen benötigten Methode fileno().

AttributeError: 'cStringIO.StringI' object has no attribute 'fileno'

Lösung

Die Dokumentation zu subprocess.Popen erfordert die Verwendung von stdin=PIPE für die Datenübertragung an stdin. Die Ersatzsyntax os.popen() wird empfohlen:

pipe = Popen(cmd, shell=True, bufsize=bufsize, stdin=PIPE).stdin

Beispiel

Anpassung des Originalcodes:

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

Python 3.5-Lösung

Für 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
# -> 

Das obige ist der detaillierte Inhalt vonWie übergebe ich Strings über stdin korrekt an „subprocess.Popen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn