Question

Dans une question relative , j'ai demandé où trouver la documentation de la fonction C « attendre. » Ce fut une tentative de comprendre les codes de retour pour le module commands.getstatusoutput (). Stackoverflow est venu à travers, mais la documentation n'a pas aidé. Voici ce qui me déconcerte:

#!/usr/bin/python
import commands
goodcommand = 'ls /'
badcommand = 'ls /fail'
status, output = commands.getstatusoutput(goodcommand)
print('Good command reported status of %s' % status)
status, output = commands.getstatusoutput(badcommand)
print('Bad command reported status of %s' % status)

Lors de l'exécution sur OS X (Leopard) j'obtenir la sortie suivante: (. Ce qui correspond à la documentation)

$ python waitest.py 
Good command reported status of 0
Bad command reported status of 256

Sur OS X, en faisant un "ls / échec;? $ Echo" obtient la sortie suivante:

$ ls /fail ; echo $?
ls: /fail: No such file or directory
1

Lors de l'exécution sur Linux (Ubuntu Hardy) j'obtenir la sortie suivante:

$ python waitest.py 
Good command reported status of 0
Bad command reported status of 512

Sur Ubuntu, faire "ls / échec" obtient 2:

$ ls /fail ; echo $?
ls: cannot access /fail: No such file or directory
2

Python semble multiplier les codes d'état par 256. Huh? Est-ce documenté quelque part?

Était-ce utile?

La solution

Il existe un ensemble de fonctions dans le module de os (os.WIFCONTINUED, os.WIFSTOPPED, os.WTERMSIG, os.WCOREDUMP, os.WIFEXITED, os.WEXITSTATUS, os.WIFSIGNALED, os.WSTOPSIG), qui correspondent à des macros de attente (2) manuel. Vous devez les utiliser pour interpréter le code d'état.

Par exemple, pour obtenir le code de sortie, vous devez utiliser os.WEXITSTATUS(status)

Une meilleure idée serait de passer au module de subprocess.

Autres conseils

Wow. L'idée qu'il multipliait par 256 me est arrivé là. Recherche de "commandes python +256" m'a fait un Python Module de la semaine article qui explique ce qui se passe.

Voici un extrait de cette page:

  

La fonction getstatusoutput () exécute un   commande par l'intermédiaire de l'enveloppe et renvoie la   code de sortie et la sortie de texte (stdout   et stderr combinés). Les codes de sortie   sont les mêmes que pour la fonction C   wait () ou os.wait (). Le code est   nombre de 16 bits. L'octet de poids faible contient   le nombre de signaux qui a tué le   processus. Lorsque le signal est égal à zéro, la   octet de poids fort est l'état de sortie de la   programme. Si un fichier de base a été produit,   le bit de poids fort de l'octet de poids faible est réglée.

Et quelques-uns du code de Doug:

from commands import *

def run_command(cmd):
    print 'Running: "%s"' % cmd
    status, text = getstatusoutput(cmd)
    exit_code = status >> 8
    signal_num = status % 256
    print 'Signal: %d' % signal_num
    print 'Exit  : %d' % exit_code
    print 'Core? : %s' % bool(exit_code / 256)
    print 'Output:'
    print text
    print

run_command('ls -l *.py')
run_command('ls -l *.notthere')
run_command('echo "WAITING TO BE KILLED"; read input')

Regarder commands.py:

def getstatusoutput(cmd):
    """Return (status, output) of executing cmd in a shell."""
    import os
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '\n': text = text[:-1]
    return sts, text

Nous voyons sts détient la valeur de os.popen(...).close(). En regardant que documentation , retourne os.popen(...).close() la valeur de os.wait :

  

os.wait()

     

Attendre la fin d'un processus enfant, et retourner un tuple contenant son pid et l'état de sortie indicatif: un nombre de 16 bits, dont l'octet de poids faible est le nombre de signaux qui a tué le processus, et dont octet de poids fort est le état de sortie (si le nombre de signaux est égal à zéro); le bit de poids fort de l'octet de poids faible est défini si un fichier de base a été produite. Disponibilité:. Unix

L'accent était le mien. Je suis d'accord que ce « encoding » est pas très intuitive, mais au moins il était assez évident à un coup d'oeil qu'il était multiplié / peu décalée.

Je pense que la détection de code est incorrect.

« Si un fichier de base a été produit, le bit de l'octet bas est réglé. » signifie 128.

donc je pense que la ligne de base doit être

print 'Core? : %s' % bool(status & 128)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top