Respostas:
Se você verificar a seção de subprocesso dos documentos do Python , verá que há um exemplo de como substituir os.system()
por subprocess.Popen()
:
sts = os.system("mycmd" + " myarg")
... faz a mesma coisa que ...
sts = Popen("mycmd" + " myarg", shell=True).wait()
O código "aprimorado" parece mais complicado, mas é melhor porque, uma vez que você sabe subprocess.Popen()
, não precisa de mais nada. subprocess.Popen()
substitui várias outras ferramentas (os.system()
é apenas uma delas) que estavam espalhadas por três outros módulos Python.
Se ajudar, pense subprocess.Popen()
em um sistema muito flexível os.system()
.
shell=True
se puder. Ter essa opção é um dos benefícios de subprocess.Popen()
e suas funções auxiliares.
os.system
esubprocess.call/popen/run
faz bloco / espera para o comando ao fim: stackoverflow.com/a/14059648/4752883
subprocess.Popen()
é um superconjunto estrito de os.system()
.
os.system
equivale ao system
comando Unix , enquanto subprocess
foi um módulo auxiliar criado para fornecer muitas das facilidades fornecidas pelos Popen
comandos com uma interface mais fácil e controlável. Eles foram projetados de forma semelhante ao comando Unix Popen .
system()
executa um comando especificado no comando chamando/bin/sh -c command
e retorna após o comando ser concluído
Enquanto que:
A
popen()
função abre um processo criando um pipe, bifurcando e chamando o shell.
Se você está pensando em qual usar, use subprocess
definitivamente porque você tem todas as facilidades para execução, além de controle adicional sobre o processo.
O subprocesso é baseado no popen2 e, como tal, tem uma série de vantagens - há uma lista completa no PEP aqui , mas algumas são:
Ao executar o python (cpython) no Windows, o sistema <built-in function system>
os.system será executado sob as cortinas _wsystem, enquanto se você estiver usando um sistema operacional diferente do Windows, ele usará o sistema .
Ao contrário, Popen deve usar CreateProcess no windows e _posixsubprocess.fork_exec em sistemas operacionais baseados em posix.
Dito isso, um conselho importante vem da documentação do os.system , que diz:
O módulo de subprocesso fornece recursos mais poderosos para gerar novos processos e recuperar seus resultados; usar esse módulo é preferível a usar esta função. Consulte a seção Substituindo funções mais antigas pelo módulo do subprocesso na documentação do subprocesso para obter algumas receitas úteis.
sts = p.wait()
vez da última linha.