Como usar o subprocesso popen Python

102

Como os.popen está sendo substituído por subprocess.popen, eu queria saber como converteria

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

para subprocess.popen ()

Eu tentei:

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

Mas acho que não estou escrevendo isso corretamente. Qualquer ajuda seria apreciada. obrigado

Stupid.Fat.Cat
fonte
1
Esta é uma máquina Windows ou Linux?
AAI

Respostas:

141

subprocess.Popen leva uma lista de argumentos:

from subprocess import Popen, PIPE

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

Há até uma seção da documentação dedicada a ajudar os usuários a migrar de os.popenpara subprocess.

Liquidificador
fonte
18
@HansThen nãoshell=True é recomendado.
Pierre GM
7
@Lukas Graf Já que diz isso no código. @Alex shell = True é considerado um risco de segurança quando usado para processar dados não confiáveis. Um invasor inteligente pode modificar a entrada para acessar comandos arbitrários do sistema. Por exemplo, inserindo filename.swf; rm -rf /o valor do nome do arquivo. No entanto, isso é apenas um problema, quando o conteúdo de seu argumento para Popen é inseguro.
Hans Então
10
@Lukas Graf Do fragmento de código, duvido muito que fosse um valor de exemplo, a ser preenchido por dados não confiáveis ​​fornecidos pelo usuário. Mas estou preparado para pedir uma trégua nesse item. Meu ponto era mais que não há razão para não usar, shell=Trueexceto ao usar entrada não confiável . Afirmar simplesmente que shell=Truenão é recomendado é enganoso.
Hans Então
7
@HansThen: PS Não me entenda mal, não estou tentando abordar seu caso aqui. É que você parece estar ciente dos riscos envolvidos shell=True, mas qualquer usuário aleatório que encontrar essa questão pode não estar. É por isso que acho importante destacar que shell=Truena verdade não é recomendado, a menos que você saiba exatamente o que está fazendo.
Lukas Graf
4
@Blender Ninguém disse que era prejudicial - é apenas perigoso. Mas, fora isso, seu argumento não faz sentido algum. Muitas funções do sistema operacional que a biblioteca padrão do Python expõe são potencialmente perigosas - veja, shutil.rmtreepor exemplo. Mas isso não tem nada a ver com o fato de estarem incluídos no stdlib ou não. Acredito que a filosofia UNIX de "Unix não foi projetado para impedir seus usuários de fazer coisas estúpidas, pois isso também os impediria de fazer coisas inteligentes." também se aplica em grande parte ao Python.
Lukas Graf
9

Use sh , vai tornar as coisas muito mais fáceis:

import sh
print sh.swfdump("/tmp/filename.swf", "-d")
amoffat
fonte
2
sh, é bom, porém não é o mesmo com Popen de subprocesso. sh é parecido com a chamada de subprocesso.
liuyang1 de
-1

Usando Subprocess da maneira mais fácil !!

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