web-dev-qa-db-fra.com

Quelle est la valeur de retour de os.system () en Python?

Je suis tombé sur ceci:

>>> import os
>>> os.system('ls')
file.txt README
0

Quelle est la valeur de retour de os.system() ? Pourquoi j'ai 0?

40
user813713

La valeur de retour de os.system dépend du système d'exploitation.

Sous Unix, la valeur de retour est un nombre de 16 bits contenant deux informations différentes. De la documentation:

un numéro de 16 bits, dont l'octet inférieur est le numéro du signal qui a tué le processus et dont l'octet supérieur est l'état de sortie (si le numéro du signal est zéro)

Donc, si le numéro de signal (octet inférieur) est 0, il serait théoriquement prudent de décaler le résultat de 8 bits (result >> 8) pour obtenir le code d'erreur. La fonction os.WEXITSTATUS fait exactement cela. Si le code d'erreur est 0, cela signifie généralement que le processus s'est terminé sans erreur.

Sous Windows, la documentation spécifie que la valeur de retour de os.system dépend de Shell. Si le shell est cmd.exe (valeur par défaut), la valeur est le code de retour du processus. Encore une fois, 0 signifierait qu'il n'y avait pas d'erreur.

Pour les autres codes d'erreur:

41
rubik

os.system('command') renvoie un nombre de 16 bits, dont les 8 premiers bits de gauche (lsb) parlent du signal utilisé par l'OS pour fermer la commande, Les 8 prochains bits parlent du code de retour de la commande.

00000000    00000000
exit code   signal num

Exemple 1 - Commande exit avec le code 1

os.system('command') #it returns 256
256 in 16 bits -  00000001 00000000
Exit code is 00000001 which means 1

Exemple 2 - Commande exit avec le code 3

os.system('command') # it returns 768
768 in 16 bits  - 00000011 00000000
Exit code is 00000011 which means 3

Maintenant, essayez avec signal - Exemple 3 - Ecrivez un programme qui dort longtemps, utilisez-le comme commande dans os.system (), puis tuez-le avec kill -15 ou kill -9

os.system('command') #it returns signal num by which it is killed
15 in bits - 00000000 00001111
Signal num is 00001111 which means 15

Vous pouvez avoir un programme python en tant que command = 'python command.py'

import sys
sys.exit(n)  # here n would be exit code

Dans le cas d'un programme c ou c ++, vous pouvez utiliser return depuis main () ou exit (n) depuis n'importe quelle fonction #

Note - Ceci est applicable sur unix

Sous Unix, la valeur de retour est l’état de sortie du processus codé au format spécifié pour wait (). Notez que POSIX ne spécifie pas la signification de la valeur de retour de la fonction C system (). La valeur de retour de la fonction Python dépend donc du système.

os.wait ()

Attendez la fin d’un processus enfant et renvoyez un tuple contenant son pid et son indication de sortie: nombre à 16 bits, dont l’octet de poids faible est le numéro du signal qui a tué le processus et dont l’octet de poids élevé est l’état de sortie (si le signal le nombre est zéro); le bit haut de l'octet bas est défini si un fichier de base a été produit.

Availability: Unix

.

22
AlokThakur

"Sous Unix, la valeur de retour est l’état de sortie du processus codé au format spécifié pour wait (). Notez que POSIX ne spécifie pas la signification de la valeur de retour de la fonction C system (), la valeur de retour de la Python dépend du système. "

http://docs.python.org/library/os.html#os.system

Il n'y a pas d'erreur, le code de sortie est donc zéro

12
Cez

os.system () renvoie une sortie unix, pas la sortie de la commande. Donc, s'il n'y a pas d'erreur, le code de sortie écrit en tant que 0.

3
sam

Vous voudrez peut-être utiliser

return_value = os.popen('ls').read()

au lieu. os.system renvoie uniquement la valeur d'erreur.

1
user2589273