Das erste Argument von python subprocess.check_output und die Shell = True

8

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?

%Vor%

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.

    
user215997 09.01.2014, 19:17
quelle

2 Antworten

10

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 Shell True ist, ist es   empfohlen, args als String und nicht als Sequenz zu übergeben.

     

Bei Unix mit 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:

%Vor%      

Unter Windows mit shell=True wird die Umgebungsvariable COMSPEC angegeben   die Standard-Shell. Sie müssen nur shell=True angeben   Windows ist, wenn der Befehl, den Sie ausführen möchten, in den   Shell (z. B. dir oder copy ). Sie benötigen shell=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.

    
Bakuriu 09.01.2014 19:25
quelle
0

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

    
imagineerThat 09.01.2014 19:38
quelle

Tags und Links