Eu quero chamar um programa externo do Python. Eu usei os dois Popen()
e call()
para fazer isso.
Qual a diferença entre os dois?
Meu objetivo específico é executar o seguinte comando do Python. Não tenho certeza de como os redirecionamentos funcionam.
./my_script.sh > output
Eu li a documentação e diz que call()
é uma função de conveniência ou uma função de atalho. Perdemos algum poder usando em call()
vez de Popen()
?
python
subprocess
popen
varunl
fonte
fonte
call()
parece ser muito clara. Você pode fornecer uma cotação ou um link para saber o que focar em uma resposta?Respostas:
Existem duas maneiras de fazer o redirecionamento. Ambos se aplicam a
subprocess.Popen
ousubprocess.call
.Defina o argumento da palavra-chave
shell = True
ouexecutable = /path/to/the/shell
e especifique o comando exatamente como você o possui.Como você está apenas redirecionando a saída para um arquivo, defina o argumento de palavra-chave
onde o objeto aponta para o
output
arquivo.subprocess.Popen
é mais geral quesubprocess.call
.Popen
não bloqueia, permitindo que você interaja com o processo enquanto estiver em execução ou continue com outras coisas no seu programa Python. A chamada paraPopen
retorna umPopen
objeto.call
faz bloco. Embora ele suporte todos os mesmos argumentos doPopen
construtor, para que você ainda possa definir a saída do processo, variáveis ambientais, etc., seu script aguarda a conclusão do programa ecall
retorna um código que representa o status de saída do processo.é basicamente o mesmo que chamar
call
é apenas uma função de conveniência. Sua implementação no CPython está em subprocess.py :Como você pode ver, é um invólucro fino ao redor
Popen
.fonte
A outra resposta é muito completa, mas aqui está uma regra prática:
call
está bloqueando:Popen
é sem bloqueio:fonte