134 votes

Comment utiliser le sous-processus popen Python

Desde os.popen est remplacé par subprocess.popen Je me demandais comment convertir

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 ça correctement. Toute aide serait appréciée. Merci

183voto

Blender Points 114729

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 y a même un de la documentation qui se consacre à aider les utilisateurs à migrer de os.popen a subprocess .

11voto

amoffat Points 192

Utilisez sh ça rendra les choses beaucoup plus faciles :

import sh
print sh.swfdump("/tmp/filename.swf", "-d")

10voto

Mai Hai Points 141

Dans la version récente de Python, subprocess a un grand changement. Il offre une toute nouvelle classe Popen pour gérer os.popen1|2|3|4 .

Le nouveau subprocess.Popen()

import subprocess
subprocess.Popen('ls -la', shell=True)

Ses arguments :

subprocess.Popen(args, 
                bufsize=0, 
                executable=None, 
                stdin=None, stdout=None, stderr=None, 
                preexec_fn=None, close_fds=False, 
                shell=False, 
                cwd=None, env=None, 
                universal_newlines=False, 
                startupinfo=None, 
                creationflags=0)

En termes simples, le nouveau Popen comprend toutes les fonctionnalités qui étaient réparties en 4 anciennes versions distinctes popen .

L'ancien popen :

Method  Arguments
popen   stdout
popen2  stdin, stdout
popen3  stdin, stdout, stderr
popen4  stdin, stdout and stderr

Vous pouvez obtenir plus d'informations dans Abus des piles - Robert Robinson . Remerciez-le pour son dévouement.

8voto

efimp Points 141

Il n'est pas toujours évident de décomposer une commande shell en une séquence d'arguments, surtout dans les cas complexes. shlex.split() peut faire la tokenisation correcte pour les args (j'utilise l'exemple d'appel de Blender) :

import shlex
from subprocess import Popen, PIPE
command = shlex.split('swfdump /tmp/filename.swf/ -d')
process = Popen(command, stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()

https://docs.python.org/3/library/subprocess.html

-3voto

Be Champzz Points 67

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X