python - ¿La llamada de línea de comandos de Linux no devuelve lo que debería de os.system?
python-2.7 command-line (10)
Necesito hacer algunas llamadas de línea de comando a Linux y obtener el retorno de esto, sin embargo hacerlo como a continuación es simplemente devolver 0
cuando debería devolver un valor de tiempo, como 00:08:19
, estoy probando exactamente la misma llamada en regular línea de comando y devuelve el valor de tiempo 00:08:19
así que estoy confundido en cuanto a lo que estoy haciendo mal, ya que pensé que era cómo hacerlo en Python.
import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
Este es un hilo antiguo, pero usando puramente el sistema os.system
, la siguiente es una forma válida de acceder a los datos devueltos por la llamada ps
. Nota: usa una tubería para escribir los datos en un archivo en el disco. Y OP no pidió específicamente una solución usando 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
Sin embargo, no tengo idea de por qué todos regresan ceros.
La forma más simple es así:
import os
retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines()
print retvalue
Esto será devuelto como una lista
Lo que se devuelve es el valor de retorno de ejecutar este comando. Lo que se ve al ejecutarlo directamente es la salida del comando en stdout. Que 0 sea devuelto significa que no hubo error en la ejecución.
Use popen, etc. para capturar la salida.
Algo a 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
No puedo agregar un comentario a IonicBurger porque no tengo "50 reputación", así que agregaré una nueva entrada. Mis disculpas. os.popen () es el mejor para comandos múltiples / complicados (mi opinión) y también para obtener el valor de retorno además de obtener stdout como los siguientes comandos más complicados:
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 Python que tienen la palabra ''archivo'' en cualquier parte de su nombre. El [...] es una lista de comprensión para eliminar (quitar) el carácter de nueva línea de cada entrada. El eco $? 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. el 2> / dev / null dice que se imprima el stderr del comando grep en / dev / null para que no aparezca en la salida. La ''r'' antes del comando ''ls'' es usar la cadena sin formato para que el shell no interprete los metacaracteres como ''*'' incorrectamente. Esto funciona en python 2.7. Aquí está el resultado de la muestra:
stdout: [''fileFilter.py'', ''fileProcess.py'', ''file_access..py'', ''myfile.py'']
returnValue: 0
Para su requerimiento, la función Popen del módulo de subproceso python 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
Sí, es contrario a la intuición y no parece muy pitónico, pero en realidad solo imita el diseño API de Unix, donde estas llamadas son funciones C POSIX. Comprueba man 3 popen
&& man 3 system
Un fragmento más conveniente para reemplazar el sistema os que utilizo:
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).
Si solo está interesado en el resultado del proceso, es más fácil utilizar la función '' check_output '' del subproceso:
output = subprocess.check_output(["command", "arg1", "arg2"]);
Luego, la salida mantiene la salida del programa en stdout. Consulte el enlace de arriba para más información.
Su código devuelve 0
si la ejecución de los comandos pasó con éxito y no es cero si falla. El siguiente programa funciona en python2.7, ha revisado 3 y versiones anteriores. Prueba este código
>>> import commands
>>> ret = commands.getoutput("ps -p 2993 -o time --no-headers")
>>> print ret
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