Heim >Backend-Entwicklung >Python-Tutorial >Wie übergebe ich einen String als stdin an subprocess.Popen?

Wie übergebe ich einen String als stdin an subprocess.Popen?

Susan Sarandon
Susan SarandonOriginal
2024-12-06 13:04:12585Durchsuche

How to Pass a String as stdin to subprocess.Popen?

Übergabe von String-Eingaben an subprocess.Popen

Der Fehler beim Versuch, ein StringIO-Objekt als stdin an subprocess.Popen zu übergeben, zeigt, dass StringIO Objekte werden vom Unterprozess nicht als gültige dateiähnliche Objekte erkannt. Um dieses Problem zu beheben und eine Zeichenfolge erfolgreich als stdin zu übergeben, muss zunächst eine Pipeline zum Popen-Prozess erstellt werden.

Explizite Pipeline-Erstellung verwenden

Der Unterprozess. In der Communicate()-Dokumentation wird vorgeschlagen, eine Pipeline mit stdin=PIPE zu erstellen, um Daten an den stdin des Prozesses zu senden. Dies kann erreicht werden, indem der Code wie folgt geändert wird:

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

Dieser Code erstellt eine Pipe zum grep-Prozess, sodass die Eingabezeichenfolge durch das stdin-Argument übergeben werden kann.

Verwenden von subprocess.run (Python 3.5)

Für Python-Versionen 3.5 und höher kann subprocess.run kann verwendet werden, um Eingaben als Zeichenfolge zu übergeben und die Ausgabe als Zeichenfolge in einem einzigen Aufruf abzurufen:

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

Dieser Ansatz bietet eine prägnante Alternative zur expliziten Pipeline-Erstellungsmethode.

Das obige ist der detaillierte Inhalt vonWie übergebe ich einen String als stdin 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