Fehlerbehebung bei Diskrepanzen bei der Übergabe von Subprocess.Popen-Argumenten
Beim Versuch, Variablen zur Skriptausführung an subprocess.Popen() zu übergeben, können Benutzer auf Schwierigkeiten stoßen wenn die Argumente in Variablen gespeichert sind. Um dieses Problem anzugehen, wollen wir uns mit dem Problem befassen und eine Lösung anbieten.
Das Problem:
Der erste Ansatz besteht darin, Argumente direkt aus den Variablen zu übergeben, wie folgt:
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 )
Diese Methode führt den Befehl jedoch nicht erfolgreich aus.
Die Lösung:
Der Schlüssel zur Lösung dieses Problems liegt in der Entfernung von „shell=True“. Wenn es auf „True“ gesetzt ist, werden die Argumente für Popen() auf Unix-Systemen unterschiedlich behandelt. Indem wir „shell=True“ weglassen, können wir die Argumente direkt als Liste übergeben:
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...
Bypassing Die Shell beseitigt das vorherige Parsing-Problem und ermöglicht die ordnungsgemäße Ausführung des Befehl.
Sicherheitsüberlegungen:
Es ist wichtig zu beachten, dass von der Einstellung „shell=True“ beim Umgang mit externen Eingaben aufgrund potenzieller Sicherheitsrisiken abgeraten wird. Aus diesem Grund wird empfohlen, die Verwendung von „shell=True“ zu vermeiden und stattdessen die oben beschriebene Methode zur Übergabe von Argumenten an Popen() zu übernehmen.
Das obige ist der detaillierte Inhalt vonWarum schlägt subprocess.Popen fehl, wenn Variablen als Argumente übergeben werden, und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!