Python subprocess calling bash script – müssen auch die zitate ausdrucken

Ich habe ein Problem mit Unterprozeß und Druckzitate.

Mein Python-Skript nimmt Benutzer-Eingabe, mashes es um ein bisschen – und ich brauche es, um seine Ergebnisse zu einem bash-Skript auf diese Weise zu senden.

myscript.sh 'var1 == a var2 == b; othervar == c' /path/to/other/files 

Wo ich aufgehängt werde, sind die einzelnen Zitate. Python versucht sie herauszureißen.

Ich habe das für meinen Test benutzt.

 subprocess.Popen([myscript.sh 'var=11; ignore all' /path/to/files], shell=True, executable="/bin/bash") 

Die eine ungültige Syntax zurückgibt, die auf das 2. einfache Zitat hinweist. Ich habe auch versucht, die oben ohne die Klammern und mit einfachen Anführungszeichen außerhalb und doppelte Anführungszeichen innen, etc.

Andere – würde-wie.

Wie ich schon sagte über die 'var == a var == b; Othervar == c 'wird aus dem Python-Skript (im String-Format) abgeleitet – und das muss ich im Unterprozess so anrufen.

 subprocess.Popen([myscript.sh myvariables /path/to/files], shell=True, executable="/bin/bash") 

Ich muss nur die einzelnen Zitate um den Wert von myvariables wie das erste Beispiel setzen.

Irgendwelche Hinweise darauf, wo ich die richtige Methode gehe?

Vielen Dank.

3 Solutions collect form web for “Python subprocess calling bash script – müssen auch die zitate ausdrucken”

Wenn shell = True an Popen übergeben wird, passierst du, was du auf der Kommandozeile senden würdest. Das heißt, deine Liste sollte nur ein Element haben. So zum Beispiel:

 subprocess.Popen(['myscript.sh "var=11; ignore all" /path/to/files'], shell=True, executable="/bin/bash") 

Oder wenn / path / to / files eine Variable in deiner Python-Umgebung ist:

 subprocess.Popen(['myscript.sh "var=11; ignore all" %s' % path_to_files], shell=True, executable="/bin/bash") 

Nachdem ich gesagt habe, ermutige ich Sie, das Shell-Argument nicht zu benutzen. Der Grund ist Zerbrechlichkeit. Sie werden eine viel robustere Art, es so zu machen:

 subprocess.Popen(["/bin/bash", "myscript.sh", "var=11; ignore all", path_to_files]) 

Beachten Sie, dass "var = 11; ignore all" als ein Argument an Ihr Skript übergeben wird. Wenn diese getrennten Argumente sind, machen sie separate Listenelemente.

Ich habe nicht überprüft, warum das funktioniert, aber es tut und ohne die Notwendigkeit für Shell = True.

 subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files]) 

Das ist eine Liste, das sind Streicher darin, also brauchen sie Zitate:

 ["myscript.sh", "var=11; ignore all", "/path/to/files"] 

Das sollte funktionieren. Wenn dein Skript wirklich irgendwie auf Zitate angewiesen ist, dann versuchst du das (ich kenne die Details nicht, wie Subprocess funktioniert):

 ["myscript.sh", "'var=11; ignore all'", "/path/to/files"] 
  • Multiprocessing.Pool Laich neue childern nach terminate () auf Linux / Python2.7?
  • Führen Sie den Hintergrundprozess in Python und warten Sie nicht
  • Interagieren mit Bash aus Python
  • Wie kann ich Stderr für einen Shell-Befehl mit einem großen Datenpuffer abrufen?
  • Terminal-Befehl aus Python im neuen Terminal-Fenster ausführen?
  • Eingabe-Befehl scheint nicht zu funktionieren, wenn mit Popen Python verwendet
  • Unterprozeßmodulfehler mit 'export' in python on linux?
  • Verwenden Sie StringIO als stdin mit Popen
  • Wird ein Python-Unterprozeß Popen 'erben' root privs, wenn das aufrufende Skript mit sudo ausgeführt wird?
  • Wie kann ich ein Benutzerkennwort in linux aus einem Python-Skript setzen?
  • Warum funktioniert das einfache Echo im Unterprozeß nicht
  • Python ist die beste Programmiersprache der Welt.