Ü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!