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?
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?
Respostas:
Para usar um tubo com o subprocess
módulo, você precisa passar shell=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
e grep
separadamente e canalize a saída de um para o outro, da seguinte maneira:
ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()
No seu caso particular, no entanto, a solução simples é chamar subprocess.check_output(('ps', '-A'))
e, str.find
em seguida, a saída.
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 na output
variável
string.find
, que foi preterido em favor de str.find
(ou seja, o método find
nos str
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 chamou ps.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.
cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)
O método de comunicação retorna uma tupla da saída padrão e do erro padrão.
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:
query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close() # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]
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
#!/bin/python
import subprocess
import shlex
cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)