58 votes

Python, os.system pour un appel en ligne de commande (linux) ne renvoyant pas ce qu’il devrait?

Je dois passer des appels en ligne de commande vers Linux et obtenir le retour correspondant, mais le faire comme ci-dessous ne fait que renvoyer 0 quand il devrait renvoyer une valeur temporelle, comme 00:08:19 , I Je teste exactement le même appel en ligne de commande normale et renvoie la valeur de temps 00:08:19 . Je suis donc confus quant à ce que je fais mal, car je pensais que c'était comment le faire en python. Tout conseil est apprécié.

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

100voto

pyfunc Points 31088

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

Utilisation popen etc pour la capture de la sortie .

Quelque chose le long de cette ligne:

import subprocess as sub
p = sub.Popen('your command',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

SUR DONC : http://stackoverflow.com/questions/1007855/popen-and-python

25voto

JoshD Points 7303

Si vous ne vous intéressez qu'au résultat du processus, il est plus simple d'utiliser la fonction check_output du sous-processus:

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

La sortie conserve ensuite la sortie du programme sur stdout. Consultez le lien ci-dessus pour plus d'informations.

10voto

HappyHamburger Points 49

Le moyen le plus simple est comme ça:

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

Ce sera retourné sous forme de liste

8voto

vikkyhacks Points 696

Votre code retourne 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, 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
 

2voto

Yauhen Yakimovich Points 2222

Oui, c'est contre-intuitif et cela ne semble pas très pythonique, mais cela ne fait en réalité que ressembler à la conception de l'API unix, où ces calld sont des fonctions C POSIX. Vérifiez man 3 popen && man 3 system

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X