2012-05-01 11 views
5

Así que estoy tratando de consulta para los 3 primeros procesos de la CPU "intensivos" en una máquina dada, y me encontré con este comando shell para hacerlo: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3tuberías de cáscara a través del módulo de Python subproceso

quiero usar esta información dentro de una secuencia de comandos de Python, así que necesito poder capturar la salida del comando anterior a través del módulo subprocess. Las siguientes obras, pero sólo devuelve una cadena enorme ya que no estoy limitarla a la parte superior 3:

psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])

No estoy muy seguro de cómo este subprocess.check_output obras .. en un intento exiguo Traté:

subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])

lo que me da un error: ps: illegal argument: |

¿Cómo se utiliza el tubo | símbolo dentro de Python, o usar alguna otra Cómo hacer la clasificación sin tener que hacer increíbles cantidades de análisis en la enorme cadena devuelta por psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])?

Gracias! Saludos, -kstruct

+0

Se podría escribir un script que contiene el código con las tuberías, a continuación, llamar a que desde el módulo de subproceso – jedwards

Respuesta

10

puede pasar el argumento shell=True para ejecutar el comando shell normal:

import subprocess 
subprocess.check_output('ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3', 
         shell=True) 

alternativa, puede utilizar las opciones de clasificación de ps y Python de las funciones integradas de cadena como esta:

raw = subprocess.check_output('ps -eo pcpu,pid,user,args --sort -pcpu') 
first_three_lines = list(raw.split('\n'))[:3] 
1

que debería funcionar si se utiliza:

subprocess.check_output("ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3", shell=True) 

entonces el comando se ejecuta exactamente como esta usando /bin/sh, por lo que los tubos funcionarán.

1

Por qué usar comandos externos en absoluto? Utilice psutil:

import psutil 
def cpu_percentage(proc): 
    try: 
     return proc.get_cpu_percent() 
    except psutil.AccessDenied: 
     return float('-inf') 

top3 = sorted(psutil.process_iter(), key=cpu_percentage, reverse=True)[:3] 
for proc in top3: 
    # do whatever 
4

Algunos otros han sugerido el uso de shell=True y this answer está bien si estás pasando a confiar en la entrada a la cáscara. Sin embargo, shell=True presenta algunas inseguridades. Para mayor seguridad, el docs recomiendan lo siguiente:

output=`dmesg | grep hda` 
# becomes 
p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 
Cuestiones relacionadas