Quiero usar subprocess.check_output()
con ps -A | grep 'process_name'
. Probé varias soluciones, pero hasta ahora nada funcionó. ¿Alguien puede guiarme cómo hacerlo?
python
linux
subprocess
pipe
zuberuber
fuente
fuente
psutil
que permite obtener información del proceso de una manera portátil.Respuestas:
Para usar una tubería con el
subprocess
módulo, debe pasarshell=True
.Sin embargo, esto no es realmente aconsejable por varias razones, entre ellas la seguridad. En su lugar, cree los procesos
ps
y porgrep
separado, y canalice la salida de uno a otro, así:En su caso particular, sin embargo, la solución simple es llamar
subprocess.check_output(('ps', '-A'))
y luegostr.find
en la salida.fuente
shell=True
subprocess.CalledProcessError: Command '('grep', 'process_name')' returned non-zero exit status 1
solo significa que grep no encontró nada, por lo que es un comportamiento normal.ps.wait()
para cuando ya tenemos la salida?ps.wait.__doc__
espera que el niño termine pero el contenido del niño ya parece estar colocado en laoutput
variablestring.find
, que ha quedado en desuso a favorstr.find
(es decir, el métodofind
en losstr
objetos).grep
muere prematuramente;ps
puede colgarse indefinidamente si produce una salida suficiente para llenar su búfer de canalización del sistema operativo (porque no ha llamadops.stdout.close()
al padre). Cambie el orden de inicio, para evitarloO siempre puede usar el método de comunicación en los objetos de subproceso.
El método de comunicación devuelve una tupla de la salida estándar y el error estándar.
fuente
communicate
es mejor quewait
. Existe una advertencia de este tipo: "Esto se bloqueará cuando se use stdout = PIPE y / o stderr = PIPE y el proceso secundario genera suficiente salida para una tubería de manera que bloquea la espera de que el búfer de tubería del sistema operativo acepte más datos. Utilice la comunicación () para evitar eso ".Consulte la documentación sobre la configuración de una tubería mediante el 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:
fuente
La solución de JKALAVIS es buena, sin embargo, agregaría una mejora para usar shlex en lugar de SHELL = TRUE. a continuación estoy agotando tiempos de consulta
fuente
Además, intente usar el
'pgrep'
comando en lugar de'ps -A | grep 'process_name'
fuente
Puede probar la funcionalidad de tubería en sh.py :
fuente
Después de Python 3.5 también puedes usar:
La ejecución del comando está bloqueando y la salida estará en process.stdout .
fuente