Ich bin verwirrt darüber, wie man Pythons Subprozess-Modul richtig einsetzt, insbesondere das erste Argument der check_output-Methode und die Option shell
. Überprüfen Sie die Ausgabe von der interaktiven Eingabeaufforderung unten. Ich übergebe das erste Argument als Liste und abhängig davon, ob shell=True
gesetzt ist, bekomme ich unterschiedliche Ausgaben. Kann jemand erklären, warum dies so ist und welche Ausgabe ausgegeben wird?
Wenn ich jetzt das erste Argument als eine einfache Zeichenfolge anstelle einer Liste übergebe, bekomme ich diese unangenehme Stapelverfolgung. Warum ist das und was geht hier vor?
%Vor%Wenn ich jedoch shell = True einschalte, funktioniert es perfekt:
%Vor% Also ich bin ein wenig verwirrt, es funktioniert, wenn der erste arg in einer Liste OHNE shell=True
ist und dann als eine einfache Zeichenfolge mit shell=True
arbeitet. Ich verstehe nicht, was shell=True
macht und den Unterschied zwischen der Übergabe des ersten Arguments als Liste an eine Zeichenfolge.
Aus der Dokumentation von Popen
:
Das Shell-Argument (standardmäßig
False
) gibt an, ob es verwendet werden soll die Shell als das auszuführende Programm. Wenn ShellTrue
ist, ist es empfohlen,args
als String und nicht als Sequenz zu übergeben.Bei Unix mit
%Vor%shell=True
wird die Shell standardmäßig auf/bin/sh
gesetzt. Wenn args ist a Zeichenfolge, die Zeichenfolge gibt den Befehl an, der über die Shell ausgeführt werden soll . Dies bedeutet, dass die Zeichenfolge genau so formatiert werden muss, wie sie wäre wenn an der Shell-Eingabeaufforderung eingegeben. Dazu gehört beispielsweise Zitat oder umgekehrter Schrägstrich, der Dateinamen mit Leerzeichen in ihnen entkommt. Wenn args ist a Sequenz, das erste Element gibt die Befehlszeichenfolge und alle an Zusätzliche Elemente werden als zusätzliche Argumente für die Shell behandelt selbst . Das heißt,Popen
macht das Äquivalent von:Unter Windows mit
shell=True
wird die Umgebungsvariable COMSPEC angegeben die Standard-Shell. Sie müssen nurshell=True
angeben Windows ist, wenn der Befehl, den Sie ausführen möchten, in den Shell (z. B.dir
odercopy
). Sie benötigenshell=True
nicht, um einen Batch auszuführen Datei oder konsolenbasierte ausführbare Datei.
In Ihrem Fall, da echo
eine integrierte Shell ist, wenn sie mit shell=True
gestartet wird, wenn Sie Argumente an den Befehl echo
übergeben wollen, müssen Sie müssen entweder den Befehl schreiben als eine Zeichenfolge oder übergeben Sie eine Sequenz mit dem Befehl gesamt als Zeichenfolge als erstes Element. Andere Elemente der Sequenz werden als Argumente an die Shell übergeben, nicht an den Befehl, den Sie aufrufen.
In einigen Betriebssystemen echo
ist auch ein Programm (normalerweise /bin/echo
). Dies erklärt, warum Ihr erstes Beispiel keine Ausnahme ausgelöst hat, sondern '\n'
anstelle der erwarteten 'Hello, World!\n'
ausgibt: Der Befehl /bin/echo
wurde ohne Argumente ausgeführt, weil das Argument von der Shell "verbraucht" wurde.
Der Fehler beim Aufruf von:
%Vor% liegt an der Tatsache, dass, weil Sie nicht shell=True
verwendet haben, python versucht, das Programm echo Hello World!
auszuführen, also ein Programm mit dem Namen echo<space>Hello<space>World!
. Es ist ein gültiger Programmname, aber Sie haben kein Programm mit diesem Namen, daher die Ausnahme.
Immer wenn Sie shell=True
verwenden, geben Sie als erstes Argument für check_output
eine Zeichenkette in Anführungszeichen ein, die darstellt, was Sie normalerweise in eine Shell eingeben. "Unter Unix mit Shell = True ist die Shell standardmäßig auf /bin/sh
gesetzt." Dies gibt Ihnen alle Shell-Funktionen. "Dies bedeutet, dass die Zeichenfolge genau so formatiert werden muss, wie wenn sie an der Shell-Eingabeaufforderung eingegeben würde." Siehe Popen
Tags und Links python linux shell subprocess