it-swarm.com.de

Linux-Befehlszeilenaufruf gibt nicht das zurück, was es von os.system sollte

Ich muss einige Befehlszeilenanrufe an Linux ausführen und die Rückkehr von diesem erhalten. Wenn Sie jedoch wie folgt vorgehen, wird nur 0 zurückgegeben, wenn ein Zeitwert zurückgegeben werden soll, wie 00:08:19 gibt den Zeitwert 00:08:19 zurück, also bin ich verwirrt, was ich falsch mache, da ich dachte, dies sei der Weg in Python.

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
56
Rick

Was zurückgegeben wird, ist der Rückgabewert der Ausführung dieses Befehls. Was Sie direkt bei der Ausführung sehen, ist die Ausgabe des Befehls in stdout. Die Rückgabe von 0 bedeutet, dass bei der Ausführung kein Fehler aufgetreten ist.

Verwenden Sie popen etc zum Erfassen der Ausgabe.

Etwas in dieser Richtung:

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

98
pyfunc

Wenn Sie nur an der Ausgabe des Prozesses interessiert sind, ist es am einfachsten, die Funktion check_output des Subprozesses zu verwenden:


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

Dann hält die Ausgabe die Programmausgabe auf stdout. Überprüfen Sie den Link oben für weitere Informationen.

25
JoshD

Der einfachste Weg ist wie folgt:

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

Dies wird als Liste zurückgegeben

10
IonicBurger

Ihr Code gibt 0 zurück, wenn die Ausführung der übergebenen Befehle erfolgreich ist, und bei einem Fehler nicht Null. Das folgende Programm funktioniert auf Python2.7, Ports 3 und Versionen oben. Versuchen Sie diesen Code.

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

Ich kann keinen Kommentar zu IonicBurger hinzufügen, da ich nicht "50 Reputation" habe Ich werde einen neuen Eintrag hinzufügen. Entschuldigen Sie. os.popen () ist am besten für mehrere/komplizierte Befehle (meiner Meinung nach) und auch zum Abrufen des Rückgabewerts sowie zum Abrufen von stdout wie die folgenden, komplizierteren, mehreren Befehle:

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]

Daraufhin werden alle Python-Dateien aufgelistet, in deren Namen sich die Word 'file' befindet. Das [...] ist ein Listenverständnis, um das Newline-Zeichen von jedem Eintrag zu entfernen (zu entfernen). Das Echo $? ist ein Shell-Befehl zum Anzeigen des Rückgabestatus des zuletzt ausgeführten Befehls, der in diesem Beispiel der Befehl grep und der letzte Eintrag der Liste sein wird. Der 2>/dev/null sagt, dass stderr des Befehls grep an/dev/null ausgegeben wird, damit er nicht in der Ausgabe angezeigt wird. Der Befehl 'r' vor dem Befehl 'ls' soll die unformatierte Zeichenfolge verwenden, damit die Shell die Metazeichen wie '*' nicht falsch interpretiert. Dies funktioniert in Python 2.7. Hier ist die Beispielausgabe:

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

Ja, es ist nicht intuitiv und scheint nicht sehr Pythonic zu sein, aber es ahmt eigentlich nur das Unix-API-Design nach, bei dem es sich um C POSIX-Funktionen handelt. Überprüfen Sie man 3 popen && man 3 system

Etwas bequemeres Snippet zum Ersetzen von os.system, das ich verwende: 

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

Für Ihre Anforderung ist die Popen-Funktion des Python-Moduls für den Teilprozess 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
1
Asif Hasnain

Dies ist ein alter Thread, der jedoch ausschließlich os.system verwendet. Dies ist eine gültige Methode, um auf die vom ps-Aufruf zurückgegebenen Daten zuzugreifen. Hinweis: Die Daten werden mithilfe einer Pipe in eine Datei auf der Festplatte geschrieben. Und OP hat nicht ausdrücklich nach einer Lösung gefragt, die os.system verwendet. 

>>> 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 Nullen zurückgeben.

1
Coriolis Force

okey ich glaube der schnellste weg wäre es

import os
print(os.popen('command').readline())
x = _
print(x)
0
George