Diferença entre subprocess.Popen e os.system


Respostas:


99

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().


Você também pode usar em sts = p.wait()vez da última linha.
Sven Marnach

1
@JacobMarble, então suponha que estou chamando um script de raspagem de selênio de outro script python, qual deles me permitiria completar o script de raspagem e, então, e somente então, executar a próxima linha de código? Como em, minha raspagem deve ser concluída antes que a execução possa continuar.
Prakhar Mohan Srivastava

Talvez também mencione stackoverflow.com/questions/3172470/… para apontar que você deve evitar o shell=Truese puder. Ter essa opção é um dos benefícios de subprocess.Popen()e suas funções auxiliares.
tripleee

@PrakharMohanSrivastava Se você deseja bloquear o fluxo e esperar que o comando conclua seu trabalho, confira: stackoverflow.com/a/2837319/5252192
AmirHossein

@PrakharMohanSrivastava, em geral, os.systemesubprocess.call/popen/run faz bloco / espera para o comando ao fim: stackoverflow.com/a/14059648/4752883
alpha_989


23

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.


ok ... então há alguma maneira de executar os.system e popen no env do windows? sou um novato e preciso me aprofundar.
Arovit

Sim, você pode usar os.system e subprocess no ambiente Windows. Dê uma olhada nos tutoriais básicos de effbot.org (livro online da Python Standard Library)
Senthil Kumaran

Cuidado - se você estiver executando em sistemas mais antigos, o módulo de subprocesso não estará disponível.
Steve Hanov

21

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:

  • usando tubo na concha
  • melhor suporte de nova linha
  • melhor tratamento de exceções

2

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.