Kann jemand erklären, warum dem gewünschten Ergebnis "Hallo" ein Buchstabe "b" und ein Zeilenumbruch vorangestellt sind?
Ich benutze Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
Dieses zusätzliche 'b' wird nicht angezeigt, wenn ich es mit Python 2.7 ausführe
python
subprocess
popen
imaginerThat
quelle
quelle
echo hi
gedruckt wirdhi\r\n
. Um dies zu vermeiden, können Sie am Ende .strip () oder einen ähnlichen Fix hinzufügen.check_output()
anstelle von.communicate()
hier verwenden:print(subprocess.check_output("echo hi", shell=True, universal_newlines=True), end="")
Antworten:
Der Befehl echo gibt standardmäßig ein Zeilenumbruchzeichen zurück
Vergleichen Sie damit:
print(subprocess.Popen("echo -n hi", \ shell=True, stdout=subprocess.PIPE).communicate()[0])
Das b vor der Zeichenfolge gibt an, dass es sich um eine Bytefolge handelt, die einer normalen Zeichenfolge in Python 2.6+ entspricht
http://docs.python.org/3/reference/lexical_analysis.html#literals
quelle
Das
b
gibt an, dass Siebytes
eine binäre Folge von Bytes und keine Folge von Unicode-Zeichen haben. Unterprozesse geben Ausgabebytes und keine Zeichen aus. Das ist also, wascommunicate()
zurückkehrt.Der
bytes
Typ ist nicht direkt in derprint()
Lage, daher wird Ihnen der Typ angezeigt,repr
denbytes
Sie haben. Wenn Sie die Codierung der Bytes kennen, die Sie vom Unterprozess erhalten haben, können Siedecode()
sie in eine druckbare konvertierenstr
:>>> print(b'hi\n'.decode('ascii')) hi
Dieses spezielle Beispiel funktioniert natürlich nur, wenn Sie tatsächlich ASCII vom Unterprozess empfangen. Wenn es nicht ASCII ist, erhalten Sie eine Ausnahme:
>>> print(b'\xff'.decode('ascii')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
Die Newline ist Teil dessen, was
echo hi
ausgegeben wurde.echo
Die Aufgabe besteht darin, die Parameter auszugeben, die Sie übergeben, gefolgt von einer neuen Zeile. Wenn Sie nicht an Leerzeichen interessiert sind, die die Prozessausgabe umgeben, können Sie Folgendes verwendenstrip()
:>>> b'hi\n'.strip() b'hi'
quelle
os.popen
ob es bei der Rückgabe von Textzeichenfolgen eine Möglichkeit gibt,subprocess.Popen
diese anstelle der Bytezeichenfolgen auch zurückzugeben.universal_newlines
, die bewirkt, dass dasPopen
Objekt Textzeichenfolgen akzeptiert und zurückgibt.check_output("dir")
, Extrahieren eines Dateinamens aus der Ausgabe und der anschließende Versuch, darauf zuzugreifen,open
schlägt fehl, wenn der Dateiname deutsche Umlaute enthält. Könnte ein Fehler sein.Wie bereits erwähnt,
echo hi
kehrt tatsächlich zurückhi\n
, was ein erwartetes Verhalten ist.Aber Sie möchten wahrscheinlich nur die Daten in einem "richtigen" Format erhalten und sich nicht mit der Codierung befassen. Alles, was Sie tun müssen, ist die
universal_newlines=True
Option zu übergeben, um dies zusubprocess.Popen()
mögen:>>> import subprocess >>> print(subprocess.Popen("echo hi", shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0]) hi
Auf diese Weise
Popen()
werden diese unerwünschten Symbole von selbst ersetzt.quelle
universal_newlines=True
Lief wie am Schnürchen. Dies sollte meiner bescheidenen Meinung nach die akzeptierte Antwort sein ...universal_newlines=True
inPopen
(um das zu entfernenb''
) als auch astrip()
in der resultierenden Zeichenfolge, wenn Sie die abschließende Newline hacken möchten.universal_newlines
ist jetzt nur ein abwärtskompatibler Alias für dentext
Parameter, der klarer ist, aber nur in Python 3.7 und höher.b ist die Bytedarstellung und \ n ist das Ergebnis der Echoausgabe.
Im Folgenden werden nur die Ergebnisdaten gedruckt
import subprocess print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())
quelle