Diferença entre subprocess.Popen e os.system

117

Qual é a diferença entre subprocess.Popen()e os.system()?

Arovit
fonte

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

Jacob Marble
fonte
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
47

subprocess.Popen()é um superconjunto estrito de os.system().

Jan Hudec
fonte
10
Esta é a resposta elegante completa.
Farsheed de
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.

Senthil Kumaran
fonte
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
Andy Mikula
fonte
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.

BPL
fonte