Comment utiliser les sous-processus popen Python
Depuis os.popen est remplacé par un sous-processus.popen, je me demandais comment puis-je convertir des
os.popen('swfdump /tmp/filename.swf/-d')
de sous-processus.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 ne suis pas correctement écris. Toute aide serait appréciée. Grâce
- Est-ce une Machine Windows ou Linux de la machine ?
Vous devez vous connecter pour publier un commentaire.
subprocess.Popen
prend une liste d'arguments:Il y a même un la section de la documentation qui se consacre à aider les utilisateurs à migrer à partir de
os.popen
àsubprocess
.shell=True
.shell=True
n'est pas recommandé?filename
n'est pas dérivée de la saisie de l'utilisateur?filename.swf; rm -rf /
pour la valeur de nom de fichier. Cependant, ce n'est un problème, lorsque le contenu de votre argument à Popen est précaire.filename
est, ou ai-je raté quelque chose?shell=True
sauf lors de l'utilisation de non fiable entrée. Indiquant simplement queshell=True
n'est pas recommandé, c'est trompeur./tmp/filename.swf
codé en dur dans sa demande, mais au lieu de cela finit avec cette chaîne en faisant le chemin de la manipulation etc.., éventuellement sur la saisie de l'utilisateur. Mais à côté de ça,shell=True
a d'autres inconvénients: Vous frayer un inutile shell processus qui n'est tout simplement pas nécessaire, dans ce cas, et en citant et en échappant peut être vraiment difficile.shell=True
, mais n'importe quel utilisateur de tomber sur cette question est peut-être pas. C'est pourquoi je pense qu'il est important de souligner queshell=True
en fait n'est pas recommandé, sauf si vous savez exactement ce que vous faites.shell=True
était si dangereux, il ne serait pas inclus danssubprocess.Popen()
comme un argument mot-clé. Il y a des risques de sécurité impliqués dans l'exécution non fiables entrée de l'utilisateur et les avantages de l'utilisation d'unlist
pour tenir les composants de la commande est qu'elle s'échappe et correctement cite les arguments, qui peuvent inclure des caractères indésirables.shell=True
peut être utilisé si vous êtes littéralement la traduction de commandes Bash pour Python (ou, corrigez-moi si je me trompe, de la tuyauterie de sortie de la commande ainsi).shutil.rmtree
par exemple. Mais qui n'a rien à voir avec le fait qu'ils sont inclus dans la stdlib ou pas. Je crois que la philosophie d'UNIX de "Unix n'a pas été conçu pour empêcher ses utilisateurs de faire des choses stupides, car cela empêcherait aussi de faire des choses intelligentes." s'applique également dans de grandes parties de Python.shell=True
est déconseillé lors de l'arbitraire d'entrée. La documentation dit: Pour cette raison, l'utilisation deshell=True
est fortement déconseillée dans les cas où la chaîne de commande est construit à partir de l'entrée externe. Pourquoi donner la commande plus de chances d'échouer lorsque vous pouvez lui donner moins?process.communicate()
plutôt queprocess.stdout
pour s'assurer que stderr est manipulé correctement?Utilisation sh, ça va rendre les choses beaucoup plus facile: