Eu quero usar subprocess.check_output()
com ps -A | grep 'process_name'
. Tentei várias soluções, mas até agora nada funcionou. Alguém pode me orientar como fazê-lo?
python
linux
subprocess
pipe
zuberuber
fonte
fonte
psutil
que permite obter informações do processo de maneira portátil.Respostas:
Para usar um tubo com o
subprocess
módulo, você precisa passarshell=True
.No entanto, isso não é realmente aconselhável por várias razões, entre as quais a segurança. Em vez disso, crie os processos
ps
egrep
separadamente e canalize a saída de um para o outro, da seguinte maneira:No seu caso particular, no entanto, a solução simples é chamar
subprocess.check_output(('ps', '-A'))
e,str.find
em seguida, a saída.fonte
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
significa apenas que nada foi encontrado pelo grep, portanto é um comportamento normal.ps.wait()
para quando já temos a saída.ps.wait.__doc__
aguarda a criança para terminar, mas o conteúdo da criança parece já colocado naoutput
variávelstring.find
, que foi preterido em favor destr.find
(ou seja, o métodofind
nosstr
objetos).grep
morrer prematuramente;ps
pode travar indefinidamente se produzir saída suficiente para preencher seu buffer de canal do SO (porque você não chamoups.stdout.close()
o pai). Troque a ordem de partida, para evitá-la #Ou você sempre pode usar o método de comunicação nos objetos do subprocesso.
O método de comunicação retorna uma tupla da saída padrão e do erro padrão.
fonte
communicate
é melhor quewait
. Existe um aviso: "Isso entra em conflito ao usar stdout = PIPE e / ou stderr = PIPE, e o processo filho gera saída suficiente para um canal, de forma que ele bloqueia a espera do buffer do canal do SO para aceitar mais dados. evite isso. "Consulte a documentação sobre a configuração de um pipeline usando o subprocesso: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline
Não testei o seguinte exemplo de código, mas deve ser aproximadamente o que você deseja:
fonte
A solução JKALAVIS é boa, no entanto, eu acrescentaria uma melhoria para usar o shlex em vez de SHELL = TRUE. abaixo im grepping out Query times
fonte
Além disso, tente usar o
'pgrep'
comando em vez de'ps -A | grep 'process_name'
fonte
Você pode experimentar a funcionalidade de canal no sh.py :
fonte
Após o Python 3.5, você também pode usar:
A execução do comando está bloqueando e a saída estará em process.stdout .
fonte