Appel de ligne de commande Linux ne renvoyant pas ce qu’il devrait provenir d’os.system?

Je dois faire des appels en ligne de commande à linux et obtenir le résultat, mais le faire comme ci-dessous revient simplement à 0 quand il devrait renvoyer une valeur de temps, comme 00:08:19 , je teste exactement le même appel en temps normal ligne de commande et il retourne la valeur de temps 00:08:19 donc je suis confus quant à ce que je fais mal car je pensais que c’était la façon de le faire en python.

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

Ce qui est retourné est la valeur de retour de l’exécution de cette commande. Ce que vous voyez en l’exécutant directement est la sortie de la commande dans stdout. Que 0 soit retourné signifie, il n’y avait pas d’erreur dans l’exécution.

Utilisez 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 

ON SO: Popen et Python

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

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

Ensuite, la sortie maintient la sortie du programme sur stdout. Consultez le lien ci-dessus pour plus d’informations.

Votre code renvoie 0 si l’exécution des commandes passées est réussie et non nulle si elle échoue. Le programme suivant fonctionne sur python2.7, cases vérifiées 3 et les versions ci-dessus. Essayez ce code.

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

La manière la plus simple est comme ceci:

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

Cela sera retourné sous forme de liste

Oui, elle est contre-intuitive et ne semble pas très pythonique, mais elle imite en fait la conception de l’API unix, où ces fonctions sont des fonctions C POSIX. Vérifiez l’ man 3 popen && man 3 system

Un extrait de code un peu plus pratique 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 append un commentaire à IonicBurger car je n’ai pas de “50 réputation” alors je vais append une nouvelle entrée. Mes excuses. os.popen () est le meilleur pour les commandes multiples / compliquées (mon opinion) et aussi pour obtenir la valeur de retour en plus d’obtenir stdout comme les commandes multiples plus compliquées suivantes:

 import os out = [ i.ssortingp() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()] print " stdout: ", out[:-1] print "returnValue: ", out[-1] 

Cela listera tous les fichiers python qui ont le mot “fichier” n’importe où dans leur nom. Le […] est une compréhension de liste pour supprimer (dénuder) le caractère de nouvelle ligne de chaque entrée. L’ écho $? est une commande shell pour afficher le statut 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. le 2> / dev / null dit d’imprimer le stderr de la commande grep dans / dev / null pour qu’il n’apparaisse pas dans la sortie. Le ‘r’ avant la commande ‘ls’ consiste à utiliser la chaîne brute afin que le shell n’interprète pas correctement les métacaractères tels que ‘*’ . Cela fonctionne en python 2.7. Voici la sortie de l’échantillon:

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

Ceci est un ancien thread, mais utilisant purement os.system , voici un moyen valide d’accéder aux données renvoyées par l’appel ps . Remarque: il utilise un tube pour écrire les données dans un fichier sur le disque. Et OP n’a pas spécifiquement demandé une solution utilisant 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 conséquence,

 >>> 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 retournent tous des zéros.

Pour vos besoins, la fonction Popen du sous-processus module python est la solution. 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 

ok je crois que le moyen le 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