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"] 
  • Verständnis python subprocess.check_output das erste Argument und shell = True
  • Wie man Java-Programm mit Python unter Berücksichtigung von Ein- und Ausgängen ausführen
  • Python liest Popen kontinuierlich (Windows)
  • Einen Befehl als Superuser aus einem Python-Skript ausführen
  • Python subprocess deadlock in dämonisierten server
  • Wie löst man abgelösten Hintergrundprozess auf Linux entweder in bash oder python
  • Python: Teilprozeßaufruf mit Shell = False funktioniert nicht
  • Python: Start Terminal-Programm und analysieren seine Ausgabe, während es läuft
  • Ausführen eines Programms in einem anderen Verzeichnis in Python
  • Wie kann ich einen kompletten Shell-Befehl aus Python ausführen?
  • Erstellen und pipieren Sie ein Datei-ähnliches Objekt als Eingabe für einen Befehl
  • Python ist die beste Programmiersprache der Welt.