Variablen an subprocess.Popen übergeben: Warum es mit Argumenten in Listen nicht funktioniert
Bei Verwendung von subprocess.Popen zum Aufrufen eines anderen Python Wenn Sie ein Skript verwenden, kann es zu Problemen bei der Übergabe von in Variablen gespeicherten Argumenten kommen. Dies kann auftreten, wenn Sie versuchen, einen Befehl wie den folgenden auszuführen:
p = subprocess.Popen( ["python mytool.py -a ", servers[server]['address'], "-x", servers[server]['port'], "-p", servers[server]['pass'], "some additional command"], shell=True, stdout=subprocess.PIPE )
Das Problem:
Das Problem entsteht durch die Verwendung von Shell=True. Wenn dieses Flag aktiviert ist, werden die an Popen() übergebenen Argumente auf Unix-Systemen anders behandelt. Die Shell interpretiert die Argumente als eine einzelne Befehlszeichenfolge, was zu unerwartetem Verhalten führen kann.
Die Lösung:
Um dieses Problem zu beheben, lassen Sie die Verwendung fallen of shell=True. Erstellen Sie stattdessen direkt eine Liste mit Argumenten und übergeben Sie sie an Popen(). Hier ist ein Beispiel:
import sys from subprocess import Popen, PIPE # Populate list of arguments args = ["mytool.py"] for opt, optname in zip("-a -x -p".split(), "address port pass".split()): args.extend([opt, str(servers[server][optname])]) args.extend("some additional command".split()) # Run script p = Popen([sys.executable or 'python'] + args, stdout=PIPE) # ... Use p.stdout here p.stdout.close() p.wait()
Indem Sie „shell=True“ entfernen und die Argumentliste manuell erstellen, stellen Sie sicher, dass die Variablen korrekt an das aufgerufene Skript übergeben werden.
Sicherheitshinweis:
Es ist wichtig zu beachten, dass die Übergabe von „shell=True“ für Befehle mit externen Eingaben ein Sicherheitsrisiko darstellen kann, wie in erwähnt die Teilprozessdokumentation. Wenn Sie in Ihrem Skript Benutzereingaben verarbeiten, wird dringend empfohlen, die Verwendung von „shell=True“ zu vermeiden, um potenzielle Schwachstellen zu vermeiden.
Das obige ist der detaillierte Inhalt vonWarum funktioniert „subprocess.Popen' nicht mit variablen Argumenten in Listen, wenn „shell=True' ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!