Heim >Backend-Entwicklung >Python-Tutorial >Wie übergebe ich Variablen ordnungsgemäß an „subprocess.Popen()' ohne Shell-Ausführung?

Wie übergebe ich Variablen ordnungsgemäß an „subprocess.Popen()' ohne Shell-Ausführung?

Barbara Streisand
Barbara StreisandOriginal
2024-11-28 06:41:10408Durchsuche

How to Properly Pass Variables to `subprocess.Popen()` without Shell Execution?

Variablenübergabeprobleme mit Subprocess.Popen()

Beim Versuch, in Variablen gespeicherte Argumente an subprocess.Popen() zu übergeben, treten bei einigen Benutzern Probleme auf Schwierigkeiten erleben. Dies ist insbesondere dann der Fall, wenn es um Argumente wie die folgenden geht:

servers[server]['address']
servers[server]['port']
servers[server]['pass']

Die direkte Anwendung dieser Variablen auf den Befehl Popen(), wie unten gezeigt, kann zu Fehlern fü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
)

Lösung: Shell-Ausführung deaktivieren

Um dieses Problem zu beheben, entfernen Sie die shell=True Argument aus dem Popen()-Aufruf. Dadurch wird verhindert, dass die Argumente von der Shell speziell behandelt werden, sodass sie stattdessen als Zeichenfolgen übergeben werden können.

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()

Beachten Sie, dass die Verwendung von shell=True für Befehle, die Benutzereingaben annehmen, Sicherheit bietet Risiken. Ziehen Sie immer alternative Methoden in Betracht, um Benutzereingaben vor potenziellen Schwachstellen zu schützen.

Das obige ist der detaillierte Inhalt vonWie übergebe ich Variablen ordnungsgemäß an „subprocess.Popen()' ohne Shell-Ausführung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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