2016-07-01 3 views
0

Ich finde das Subprozess-Modul, in dem Sie eine Liste anstelle einer Zeichenfolge laden (Shell = True), um wirklich frustrierend. Intuitiv subprocess.call ([ "Modul", "Liste"]) sollte funktionieren, aber es funktioniert nicht und ergibt dies:Warum schlägt subprocess.call (["module", "list"]) fehl?

File "test.py", line 45, in main 
    subprocess.call(["module","list"]) 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/tools/general/app/Python-2.7.3/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
    OSError: [Errno 2] No such file or directory 

jedoch subprocess.call("module list", shell=True) Werke. Warum?

+0

vielleicht eine Shell-init-Datei nicht einig Pfade Manipulationen zu machen, so dass 'module' gefunden werden kann? – mgilson

+1

Funktioniert es, wenn Sie den vollständigen Pfad zum 'Modul' Programm verwenden? – Barmar

Antwort

-1

Dies ist einfach das Format des Befehls. Beim Parsen ohne durch eine Shell zu gehen, wird jeder Befehl und jedes Argument einzeln durchlaufen. Aber wenn dem Interpreter gesagt wird, dass er einfach die gnome-shell benutzen soll (was viel besser beim Parsing der ganzen Kommandostrings ist und pingelig in Bezug auf den Abstand ist), wird sich das Format des Kommandos ändern, um das zu reflektieren. Dieses Analyseproblem spiegelt sich in der Sicherheitsgefährdung wider, die dadurch entsteht, dass unsanitisierte Eingaben direkt in einen Shell-Prozess gepumpt werden. Von the docs:

Ausführen von Shell-Befehlen, die aufpoliert Eingabe von einer nicht vertrauenswürdigen Quelle integrieren macht ein Programm anfällig Injektion, Shell, eine ernsthafte Sicherheitslücke, das in beliebiger Befehlsausführung zur Folge haben kann. Aus diesem Grunde ist die Verwendung von shell=True stark in Fällen entmutigt, wo die Befehlsfolge von einem externen Eingang aufgebaut ist:

+0

Eine bessere Auswahl der Dokumente wäre "Wenn Shell True ist, wird der angegebene Befehl durch die Shell ausgeführt ... Unter Unix mit Shell = True, ** ist die Shell standardmäßig auf/bin/sh **. Wenn args ist Eine Zeichenfolge, die Zeichenfolge gibt den Befehl an, der über die Shell ausgeführt werden soll. " Dies kann bedeuten, dass der Befehl 'module' über die Shell verfügbar ist, aber nicht, wenn er direkt in Python verwendet wird. Da das Modul nicht wie ein "echtes" Programm aussieht, ist es für Python nicht verfügbar. Siehe Paketinitialisierung in http://modules.sourceforge.net/man/module.html – KymikoLoco