Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich einen String an die stdin von subprocess.Popen weiterleiten?

Wie kann ich einen String an die stdin von subprocess.Popen weiterleiten?

Susan Sarandon
Susan SarandonOriginal
2024-12-08 18:31:10510Durchsuche

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

So leiten Sie einen String über das Stdin-Argument an subprocess.Popen weiter

Die Funktion subprocess.Popen ermöglicht es Python-Skripten, neue Prozesse zu erzeugen und interagieren mit ihren Standardeingaben, -ausgaben und -fehlern. Ein häufiger Anwendungsfall besteht darin, Daten über seinen stdin an den untergeordneten Prozess zu übergeben, was durch die Angabe von stdin=PIPE während der Objekterstellung erreicht werden kann.

Der Versuch, ein cStringIO.StringIO-Objekt als stdin-Stream zu verwenden, führt jedoch zu ein Fehler, da das von subprocess.Popen erwartete fileno-Attribut fehlt. Um dieses Problem zu beheben, verwenden Sie die folgenden Techniken:

Verwenden von Popen.communicate()

Gemäß der offiziellen Dokumentation erwartet Popen.communicate() die Weitergabe von Daten über den Eingabeparameter und nicht über den stdin-Stream. Ändern Sie Ihren Code wie folgt:

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())

Verwenden von subprocess.run (Python 3.5)

Für Python-Versionen 3.5 und höher bietet subprocess.run eine vereinfachte Möglichkeit zur Verwaltung Teilprozesse. Es ermöglicht Ihnen, String-Eingaben zu übergeben und String-Ausgaben in einem einzigen Funktionsaufruf zu erhalten:

#!/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)

Durch die Übernahme dieser Ansätze können Sie effektiv einen String über das stdin-Argument an subprocess.Popen übergeben, was Ihren Programmen dies ermöglicht nahtlos mit externen Prozessen interagieren.

Das obige ist der detaillierte Inhalt vonWie kann ich einen String an die stdin von subprocess.Popen weiterleiten?. 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