Cómo usar el comando `subprocess` con tuberías

Quiero usar subprocess.check_output() con ps -A | grep 'process_name' ps -A | grep 'process_name' . Probé varias soluciones pero hasta ahora nada funcionó. ¿Alguien me puede guiar cómo hacerlo?

Para usar una tubería con el módulo de subprocess , debe pasar shell=True .

Sin embargo, esto no es realmente recomendable por varias razones, entre las que se encuentra la seguridad. En su lugar, cree los procesos ps y grep separado, y canalice la salida de uno a otro, así:

 ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE) output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout) ps.wait() 

Sin embargo, en su caso particular, la solución simple es llamar a subprocess.check_output(('ps', '-A')) y luego str.find en la salida.

O siempre puede utilizar el método de comunicación en los objetos de subproceso.

 cmd = "ps -A|grep 'process_name'" ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT) output = ps.communicate()[0] print output 

El método de comunicación devuelve una tupla de la salida estándar y el error estándar.

Consulte la documentación sobre la configuración de una canalización utilizando subproceso: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

No he probado el siguiente ejemplo de código, pero debería ser aproximadamente lo que quieres:

 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] 

Además, intente usar 'pgrep' comando 'pgrep' lugar de 'ps -A | grep 'process_name' 'ps -A | grep 'process_name'

La solución de JKALAVIS es buena, sin embargo, agregaría una mejora para usar shlex en lugar de SHELL = TRUE. debajo im grepping fuera tiempos de consulta

 #!/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 

Aclamaciones,

Puedes probar la funcionalidad de la tubería en sh.py :

 import sh print sh.grep(sh.ps("-ax"), "process_name")