Heim > Backend-Entwicklung > Python-Tutorial > Warum schlägt subprocess.Popen fehl, wenn Variablen als Argumente übergeben werden, und wie kann ich das Problem beheben?

Warum schlägt subprocess.Popen fehl, wenn Variablen als Argumente übergeben werden, und wie kann ich das Problem beheben?

Linda Hamilton
Freigeben: 2024-12-04 04:32:10
Original
569 Leute haben es durchsucht

Why Does subprocess.Popen Fail When Passing Variables as Arguments, and How Can I Fix It?

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
)
Nach dem Login kopieren

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...
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage