Frage

Ich brauche ein paar Kommandozeilenaufrufe auf Linux zu machen und die Rückkehr von diesem zu erhalten, tat es aber, wie unten nur 0 zurückkehren, wenn es einen Zeitwert zurückgeben sollte, wie 00:08:19, teste ich den exakt gleichen Anruf in regelmäßigem Befehl Linie und es gibt 00:08:19 den Zeitwert so ich bin verwirrt, was ich falsch mache, wie ich dachte, das war, wie es in python zu tun.

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
War es hilfreich?

Lösung

Was zurückgegeben wird ist der Rückgabewert diesen Befehl auszuführen. Was Sie sehen, in während es direkt Ausführung ist die Ausgabe des Befehls in stdout. Die 0 zurückgegeben Mittel, gab es keine Fehler in der Ausführung.

Verwenden popen etc, um die Ausgabe zu erfassen.

Einige Sache entlang dieser Linie:

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

oder

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

ON SO: Popen und Python

Andere Tipps

Wenn Sie nur in der Ausgabe von dem Prozess interessiert sind, ist es am einfachsten zu bedienen subprocess' check_output Funktion:


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

hält dann ausgegeben, das Programm auf stdout ausgegeben. Überprüfen Sie den Link oben für weitere Informationen.

Der einfachste Weg ist wie folgt aus:

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

Dies wird als eine Liste zurückgegeben werden

Ihr Code kehrt 0, wenn die Ausführung der übergebenen Befehle erfolgreich und nicht Null ist, wenn es fehlschlägt. Das folgende Programm arbeitet auf python2.7, haven geprüft 3 und Versionen oben. Versuchen Sie diesen Code.

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

Ja, es ist kontraintuitiv und scheint nicht sehr pythonic, aber es eigentlich nur imitiert das Unix-API-Design, wo diese calld sind C POSIX-Funktionen. Überprüfen Sie man 3 popen && man 3 system

Etwas bequemen Schnipsel ersetzen os.system , dass ich benutze:

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).

Ich kann keinen Kommentar zu IonicBurger hinzufügen, weil ich so nicht „50 Ruf“ habe Ich werde einen neuen Eintrag hinzuzufügen. Entschuldigen Sie. os.popen () ist die beste für mehrere / kompliziert Befehle (meiner Meinung nach) und auch den Rückgabewert zusätzlich für das Erhalten stdout wie die folgenden, kompliziert mehrere Befehle zu bekommen:

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]

Damit werden alle Python-Dateien auflisten, die das Wort haben ‚Datei‘ überall in ihrem Namen. Die [...] ist eine Liste Verständnis zu entfernen (Streifen) die Newline-Zeichen von jedem Eintrag. Das echo $? ist ein Shell-Befehl, um den Rückgabestatus des letzten Befehls zu zeigen, ausgeführt, die der Befehl grep sein wird und das letzte Element der Liste in diesem Beispiel. 2> / dev / null , sagt der stderr des grep Befehl / dev / null so es zeigt nicht in der Ausgabe auf. Das 'r' vor dem 'ls' Befehl ist die rohe Zeichenfolge zu verwenden, damit die Schale nicht Metazeichen wie interpretieren '*' falsch. Dies funktioniert in Python 2.7. Hier ist die Beispielausgabe:

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

Dies ist ein alter Thread, aber rein os.system verwenden, die folgende ist eine gültige Möglichkeit, die Daten für den Zugriff durch den ps Aufruf zurückgegeben. Hinweis: es ein Rohr nicht verwenden, um die Daten in eine Datei auf der Festplatte zu schreiben. und OP daher wurde eine Lösung nicht speziell fragen os.system verwenden.

>>> 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

entsprechend

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

Keine Ahnung, warum sie alle zurückkehr Nullen though.

Für Ihre Anforderung, Popen Funktion subprocess Python-Modul ist die Antwort. Zum Beispiel:

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 ich die schnellste Art und Weise glauben, es wäre

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 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top