Python Subprozess Grep

9

Ich versuche, den Befehl grep in einem Python-Skript mit dem Unterprozessmodul zu verwenden.

Folgendes habe ich:

%Vor%

Und es gibt nichts zurück. Ich bin nicht ganz sicher, was ich falsch mache, also kann jemand bitte erklären. Die aktuelle Methode, die ich benutze, die funktioniert, ist das Hinzufügen der Shell = true, die es die korrekte Ausgabe ausgibt, aber wie die Hilfeseiten darauf hingewiesen haben, dass es unsicher ist. Ich brauche Hilfe, um diese Arbeit so zu machen, dass mein Skript nicht unsicher ist.

    
Jason Zhu 31.10.2011, 16:52
quelle

3 Antworten

9

Ich denke, du stößt auf zwei Probleme:

  1. Dieser Anruf:

    %Vor%

    funktioniert nicht wie erwartet ohne shell=True , weil die Liste der Argumente direkt an os.execvp übergeben wird, was erfordert, dass jedes Element eine einzelne Zeichenfolge ist, die ein Argument darstellt. Sie haben zwei separate Argumente zu einer einzigen Zeichenkette zusammengefasst (mit anderen Worten interpretiert grep " foo12 *.log " als Muster und nicht + Datei Liste).

    Sie können das beheben, indem Sie sagen:

    %Vor%
  2. Das zweite Problem ist, dass auch ohne shell=True , execvp nicht weiß, was Sie mit *.log meinen und es direkt an grep weitergibt, ohne den Wildcard-Erweiterungsmechanismus der Shell zu durchlaufen. Wenn Sie shell=True nicht verwenden möchten, können Sie stattdessen Folgendes tun:

    %Vor%
bjlaub 31.10.2011, 17:11
quelle
7

Hier sind zwei getestete Code-Stücke zum Modellieren:

%Vor%

Verwenden Sie Letzteres, wenn Sie möchten, dass die Shell Wildcard-Erweiterungen für Sie ausführt. Wenn shell True ist, stellen Sie sicher, dass Sie den gesamten Befehl in eine einzelne Zeichenfolge und nicht in eine Liste separater Felder einfügen.

    
Raymond Hettinger 31.10.2011 16:59
quelle
4

Ich gehe davon aus, dass Sie in allen Dateien, die mit ".log" enden, nach "foo12" grepen wollen, damit dies nur mit subprocess funktioniert. Sie müssen Ihren Code wie folgt ändern:

%Vor%

shell=True ist für die Platzhaltererweiterung erforderlich, und wenn diese Option festgelegt ist, müssen Sie einen Zeichenfolgenbefehl anstelle einer Liste angeben.

Achten Sie außerdem darauf, dass bei der Angabe einer Liste von Argumenten, dass jedes Argument ein separater Eintrag in der Liste ist, Ihr ursprünglicher Code dem folgenden Beispiel entsprach:

%Vor%     
Andrew Clark 31.10.2011 17:02
quelle

Tags und Links