Question

Je dois faire des appels de ligne de commande pour Linux et obtenir le retour de cela, mais le faire comme ci-dessous est juste retour 0 quand il doit retourner une valeur de temps, comme 00:08:19, je teste le même appel exact dans la commande régulière ligne et renvoie la valeur de temps 00:08:19 donc je suis confus quant à ce que je fais mal que je pensais que c'était comment le faire en python.

import os
retvalue = os.system("ps -p 2993 -o time --no-headers")
print retvalue
Était-ce utile?

La solution

Ce qui est retournée est la valeur de retour de l'exécution de cette commande. Ce que vous voyez dans tout l'exécuter directement la sortie de la commande dans stdout. Ce 0 est renvoyé des moyens, il n'y avait pas d'erreur dans l'exécution.

Utilisation popen etc pour capturer la sortie.

Quelque chose le long de cette ligne:

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

ou

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

SO: Popen et python

Autres conseils

Si vous n'êtes intéressé que par la sortie du processus, il est plus facile d'utiliser le sous-processus check_output fonction:


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

Ensuite, la sortie maintient la sortie du programme à stdout. Vérifiez le lien ci-dessus pour plus d'informations.

La façon la plus simple est comme ceci:

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

Il vous sera restitué sous forme de liste

Votre code retourne 0 si l'exécution des commandes passées est nul et non réussie si elle échoue. Le programme suivant fonctionne sur python2.7, havre de paix vérifié 3 et les versions ci-dessus. Essayez ce code.

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

Oui, il est contre-intuitif et ne semble pas très pythonique, mais il fait juste imite la conception de l'API unix, où ces calld sont des fonctions C POSIX. Consultez man 3 popen && man 3 system

Un peu plus commode extrait pour remplacer os.system que j'utilise:

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

Je ne peux pas ajouter un commentaire à IonicBurger parce que je n'ai pas « 50 réputation » si Je vais ajouter une nouvelle entrée. Mes excuses. os.popen () est la meilleure pour plusieurs / commandes compliquées (mon opinion) et aussi pour obtenir la valeur de retour en plus d'obtenir comme les stdout multiples commandes plus compliquées suivantes:

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]

Ceci listera tous les fichiers python qui ont le mot « fichier » ne importe où dans leur nom. [...] est une compréhension de la liste pour supprimer (bande) le caractère de nouvelle ligne chaque entrée. echo $? est une commande shell pour afficher l'état de retour de la dernière commande exécutée qui sera la commande grep et le dernier élément de la liste dans cet exemple. 2> / dev / null dit imprimer stderr de la grep pour / dev / null si il ne se présente pas dans la sortie. 'r' avant la commande ls ' est d'utiliser la chaîne brute de sorte que le shell n'interprétera métacaractères comme '*' de manière incorrecte. Cela fonctionne en python 2.7. Voici l'exemple de sortie:

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

Ceci est un vieux fil, mais uniquement en utilisant os.system, ce qui suit est un moyen valable d'accéder aux données renvoyées par l'appel ps. Note: il n'utilise un tuyau pour écrire les données dans un fichier sur le disque. OP ne mentionnent pas spécifiquement une solution à l'aide 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

Par conséquent,

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

Aucune idée pourquoi ils sont tous des zéros de retour si.

Pour vos besoins, la fonction Popen du module python sous-processus est la réponse. Par exemple,

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 Je crois que la façon la plus rapide serait

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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top