Verwendung des Unterprozesses popen Python

102

Da os.popen durch subprocess.popen ersetzt wird, habe ich mich gefragt, wie ich konvertieren soll

os.popen('swfdump /tmp/filename.swf/ -d')

zu subprocess.popen ()

Ich habe es versucht:

subprocess.Popen("swfdump /tmp/filename.swf -d")
subprocess.Popen("swfdump %s -d" % (filename))  # NOTE: filename is a variable
                                                # containing /tmp/filename.swf

Aber ich denke, ich schreibe das nicht richtig auf. Jede Hilfe wäre dankbar. Vielen Dank

Stupid.Fat.Cat
quelle
1
Ist das eine Windows-Maschine oder eine Linux-Maschine?
AAI

Antworten:

140

subprocess.Popen nimmt eine Liste von Argumenten:

from subprocess import Popen, PIPE

process = Popen(['swfdump', '/tmp/filename.swf', '-d'], stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

Es gibt sogar einen Abschnitt in der Dokumentation, der Benutzern bei der Migration von os.popennach hilft subprocess.

Mixer
quelle
18
@HansThen shell=Truewird nicht empfohlen.
Pierre GM
7
@ Lukas Graf Da steht es so im Code. @Alex shell = True wird als Sicherheitsrisiko angesehen, wenn nicht vertrauenswürdige Daten verarbeitet werden. Ein kluger Angreifer kann die Eingabe ändern, um auf beliebige Systembefehle zuzugreifen. ZB durch Eingabe filename.swf; rm -rf /des Wertes des Dateinamens. Dies ist jedoch nur dann ein Problem, wenn der Inhalt Ihres Arguments an Popen unsicher ist.
Hans dann
10
@Lukas Graf Aus dem Codefragment bezweifle ich stark, dass dies als Beispielwert gedacht war, der von nicht vertrauenswürdigen, vom Benutzer bereitgestellten Daten ausgefüllt werden sollte. Aber ich bin bereit, einen Waffenstillstand zu schließen. Mein Punkt war mehr, dass es keinen Grund gibt, nicht zu verwenden, shell=Trueaußer wenn nicht vertrauenswürdige Eingaben verwendet werden. Die bloße Angabe, dass dies shell=Truenicht empfohlen wird, ist irreführend.
Hans dann
7
@HansThen: PS Versteh mich nicht falsch, ich versuche hier nicht, auf deinen Fall einzugehen. Es ist nur so, dass Sie sich der damit verbundenen Risiken bewusst zu sein scheinen shell=True, aber jeder zufällige Benutzer, der über diese Frage stolpert, ist dies möglicherweise nicht. Aus diesem Grund denke ich, dass es wichtig ist hervorzuheben, dass dies shell=Truetatsächlich nicht empfohlen wird, es sei denn, Sie wissen genau, was Sie tun.
Lukas Graf
4
@Blender Niemand sagte, es sei schädlich - es ist nur gefährlich. Abgesehen davon macht Ihr Argument überhaupt keinen Sinn. Viele Betriebssystemfunktionen, die die Python-Standardbibliothek verfügbar macht, sind potenziell gefährlich - shutil.rmtreezum Beispiel. Das hat aber nichts damit zu tun, ob sie in der stdlib enthalten sind oder nicht. Ich glaube, die UNIX-Philosophie von "Unix wurde nicht entwickelt, um seine Benutzer davon abzuhalten, dumme Dinge zu tun, da dies sie auch davon abhalten würde, kluge Dinge zu tun." gilt auch zu großen Teilen für Python.
Lukas Graf
9

Verwenden Sie sh , es wird die Dinge viel einfacher machen:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
quelle
2
sh, es ist gut, aber es ist nicht dasselbe mit Popen des Unterprozesses. sh ist gleich mit dem Aufruf des Unterprozesses.
Liuyang1
-1

Unterprozess auf einfachste Weise verwenden !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Sei Champzz
quelle
Vermeiden Sie die Verwendung shell=Trueund übergeben Sie stattdessen eine Liste von Argumenten (z. B. subprocess.call(['pip', 'install', 'numpy'])). shell=Trueist bei vom Benutzer bereitgestellten Eingaben unsicher (der Benutzer kann beliebige Befehle ausführen, wenn er ein Argument steuert) und aufgrund von Shell-Anführungsregeln schwieriger zu verwenden.
Chris Warrick