Comment utiliser le sous-processus popen Python

102

Depuis que os.popen est remplacé par subprocess.popen, je me demandais comment convertirais-je

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

à subprocess.popen ()

J'ai essayé:

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

Mais je suppose que je n'écris pas correctement cela. Toute aide serait appréciée. Merci

Stupide.Fat.Cat
la source
1
S'agit-il d'une machine Windows ou Linux?
AAI

Réponses:

141

subprocess.Popen prend une liste d'arguments:

from subprocess import Popen, PIPE

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

Il existe même une section de la documentation consacrée à aider les utilisateurs à migrer de os.popenvers subprocess.

Mixeur
la source
18
@HansThen shell=Truen'est pas recommandé.
Pierre GM du
7
@Lukas Graf Puisqu'il le dit dans le code. @Alex shell = True est considéré comme un risque de sécurité lorsqu'il est utilisé pour traiter des données non approuvées. Un attaquant intelligent peut modifier l'entrée pour accéder à des commandes système arbitraires. Par exemple, en saisissant filename.swf; rm -rf /la valeur du nom de fichier. Cependant, ce n'est un problème que lorsque le contenu de votre argument à Popen n'est pas sécurisé.
Hans Then
10
@Lukas Graf À partir du fragment de code, je doute fortement que ce soit une valeur d'exemple, à remplir par des données fournies par des utilisateurs non fiables. Mais je suis prêt à appeler une trêve sur ce point. Mon point était plus qu'il n'y a aucune raison de ne pas utiliser shell=Truesauf lorsque vous utilisez une entrée non approuvée . Dire simplement que ce shell=Truen'est pas recommandé est trompeur.
Hans Then
7
@HansThen: PS Ne vous méprenez pas, je n'essaye pas de parler de votre cas ici. C'est juste que vous semblez être conscient des risques impliqués shell=True, mais tout utilisateur aléatoire qui tombe sur cette question peut ne pas l'être. C'est pourquoi je pense qu'il est important de souligner qu'en shell=Truefait ce n'est pas recommandé, à moins que vous ne sachiez exactement ce que vous faites.
Lukas Graf du
4
@Blender Personne n'a dit que c'était dangereux - c'est simplement dangereux. Mais à part cela, votre argument n'a aucun sens. De nombreuses fonctions du système d'exploitation exposées par la bibliothèque standard Python sont potentiellement dangereuses, shutil.rmtreepar exemple. Mais cela n'a rien à voir avec le fait qu'ils soient inclus dans la bibliothèque stdlib ou non. Je crois que la philosophie UNIX de «Unix n'a pas été conçue pour empêcher ses utilisateurs de faire des choses stupides, car cela les empêcherait également de faire des choses intelligentes». s'applique également en grande partie à Python.
Lukas Graf
9

Utilisez sh , cela rendra les choses beaucoup plus faciles:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
la source
2
sh, c'est bon, mais ce n'est pas pareil avec Popen de sous-processus. sh est similaire à l'appel du sous-processus.
liuyang1
-1

Utiliser Subprocess de la manière la plus simple !!

import subprocess
cmd = 'pip install numpy'.split()  #replace with your command
subprocess.call(cmd)
Soyez Champzz
la source