Cómo ejecutar “ps cax | grep algo en Python?

¿Cómo ejecuto un comando con una tubería | ¿en eso?

El módulo de subproceso parece complejo …

Hay algo como

 output,error = `ps cax | grep something` 

como en shell script?

Consulte Sustitución de la tubería de la carcasa :

 import subprocess proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE) proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits. out, err = proc2.communicate() print('out: {0}'.format(out)) print('err: {0}'.format(err)) 

PD. Usar shell=True puede ser peligroso. Ver por ejemplo la advertencia en los documentos.


También está el módulo sh, que puede hacer que las secuencias de comandos de subprocesos en Python sean mucho más agradables:

 import sh print(sh.grep(sh.ps("cax"), 'something')) 

Ya has aceptado una respuesta, pero:

¿Realmente necesitas usar grep? Yo escribiría algo como:

 import subprocess ps = subprocess.Popen(('ps', 'cax'), stdout=subprocess.PIPE) output = ps.communicate()[0] for line in output.split('\n'): if 'something' in line: ... 

Esto tiene las ventajas de no involucrar a shell=True y su riesgo, no descompone un proceso grep separado, y se parece mucho a la clase de Python que escribiría para procesar objetos similares a archivos de datos.

 import subprocess process = subprocess.Popen("ps cax | grep something", shell=True, stdout=subprocess.PIPE, ) stdout_list = process.communicate()[0].split('\n') 

¡Suelte el subproceso ‘ps’ y retroceda lentamente! 🙂

Utilice el módulo psutil en su lugar.

 import os os.system('ps -cax|grep something') 

Si quieres reemplazar el argumento grep con alguna variable:

 os.system('ps -cax|grep '+your_var)