appel de ligne de commande Linux ne retourne pas ce qu'il devrait de os.system?
-
05-10-2019 - |
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
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