Pregunta

Tengo que hacer algunas llamadas de línea de comandos para Linux y obtener el retorno de esto, sin embargo, hacerlo como a continuación se acaban de volver 0 cuando debería devolver un valor de tiempo, como 00:08:19, estoy probando la misma llamada exacta al mando regulares la línea y devuelve el valor de tiempo 00:08:19 así que estoy confundido en cuanto a lo que estoy haciendo mal como pensé que esto era cómo hacerlo en Python.

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
¿Fue útil?

Solución

Lo que se devuelve es el valor de retorno de la ejecución de este comando. Lo que se ve en al ejecutar directamente es el resultado del comando en la salida estándar. 0 significa que se devuelve, no hubo un error en la ejecución.

Uso popen etc para capturar la salida.

Algunos lo largo de esta línea:

import subprocess as sub
p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE)
output, errors = p.communicate()
print output

o

import os
p = os.popen('command',"r")
while 1:
    line = p.readline()
    if not line: break
    print line

ON SO: Popen y Python

Otros consejos

Si sólo está interesado en el resultado del proceso, que es más fácil de usar subproceso check_output función:


output = subprocess.check_output(["command", "arg1", "arg2"]);

A continuación, la salida mantiene la salida del programa en la salida estándar. Compruebe el enlace de arriba para obtener más información.

La forma más sencilla es la siguiente:

import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue

Este será devuelto como una lista

Sus código vuelve 0 si la ejecución de los comandos pasaron con éxito es cero y no si falla. El siguiente programa funciona en python2.7, refugio controlada 3 y versiones anteriores. Prueba este código.

>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret

Sí, es contrario a la intuición y no parece muy Pythonic, pero en realidad sólo imita el diseño de la API de Unix, donde éstos se tituló son funciones C POSIX. Compruebe man 3 popen && man 3 system

fragmento Algo más conveniente para reemplazar os.system que yo uso:

from subprocess import (PIPE, Popen)


def invoke(command):
    '''
    Invoke command as a new system process and return its output.
    '''
    return Popen(command, stdout=PIPE, shell=True).stdout.read()


result = invoke('echo Hi, bash!')
# Result contains standard output (as you expected it in the first place).

No se puede dejar un comentario a IonicBurger porque no tengo "50 reputación", por lo Voy a añadir una nueva entrada. Mis disculpas. os.popen () es la mejor para múltiples / comandos complicados (mi opinión) y también para conseguir el valor de retorno, además de recibir la salida estándar como los múltiples comandos siguiente más complicado:

import os
out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()]
print "     stdout: ", out[:-1]
print "returnValue: ", out[-1]

Esto mostrará una lista de todos los archivos de pitón que tienen la palabra 'archivo' en cualquier lugar de su nombre. La [...] es una lista por comprensión para eliminar (tira) el carácter de nueva línea de cada entrada. La echo $? es un comando de shell para mostrar el estado de retorno del último comando ejecutado que será el comando grep y el último elemento de la lista en este ejemplo. 2> / dev / null le dice al imprimir el stderr del grep> a / dev / null por lo que no aparece en la salida. La 'r' antes de 'ls' de comandos es utilizar la cadena de texto por lo que la cáscara no interpretará metacaracteres como '*' de forma incorrecta. Esto funciona en Python 2.7. Aquí está el resultado de ejemplo:

      stdout:  ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py']
 returnValue:  0

Este es un hilo viejo, pero únicamente utilizando os.system, la siguiente es una forma válida de acceder a los datos devueltos por la llamada ps. Nota: se hace uso de un tubo de escribir los datos en un archivo en el disco. y OP no pedí específicamente para una solución utilizando os.system.

>>> os.system("ps > ~/Documents/ps.txt")
0    #system call is processed.
>>> os.system("cat ~/Documents/ps.txt")
  PID TTY          TIME CMD
 9927 pts/0    00:00:00 bash
10063 pts/0    00:00:00 python
12654 pts/0    00:00:00 sh
12655 pts/0    00:00:00 ps
0

en consecuencia,

>>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt")
0
>>> os.system("cat ~/Documents/ps.txt")
00:00:00
0

No sé por qué todos vuelven ceros sin embargo.

Para su requisito, la función del módulo de subproceso Popen pitón es la respuesta. Por ejemplo,

import subprocess
..
process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
print stdout

okey Creo que la forma más rápida sería

import os
print(os.popen('command').readline())
x = _
print(x)
using commands module
import commands
""" 
Get high load process details 
"""
result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1")
print result  -- python 2x
print (result) -- python 3x 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top