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
Freigeben: 2024-12-05 09:54:12
Original
554 Leute haben es durchsucht

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]
Nach dem Login kopieren

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'
Nach dem Login kopieren

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
Nach dem Login kopieren

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
# ->
Nach dem Login kopieren

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
# -> 
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage