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=Truese puder. Ter essa opção é um dos benefícios de subprocess.Popen()e suas funções auxiliares.
os.systemesubprocess.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.systemequivale ao systemcomando Unix , enquanto subprocessfoi um módulo auxiliar criado para fornecer muitas das facilidades fornecidas pelos Popencomandos 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 commande 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 subprocessdefinitivamente 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.