76 votes

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

Je suis tombé sur ça :

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

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

73voto

rubik Points 2270

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 qui contient deux informations différentes. Extrait de la documentation :

un nombre de 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 fort est l'état de sortie (si le numéro du signal est égal à zéro).

Ainsi, si le numéro du signal (octet de poids faible) est 0, il serait, en théorie, sûr 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 précise que la valeur de retour de la fonction os.system est dépendant du shell. Si l'interpréteur de commandes est cmd.exe (celui par défaut), la valeur est le code de retour du processus. Là encore, 0 signifierait qu'il n'y a pas eu d'erreurs.

Pour les autres codes d'erreur :

35voto

AlokThakur Points 2167

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

00000000    00000000
exit code   signal num

Exemple 1 - sortie de la commande 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 - sortie de la commande 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 le signal - Exemple 3 - Ecrivez un programme qui dort pendant un long moment, utilisez-le comme commande dans os.system() et ensuite tuez-le par 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 comme 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 de main() ou exit(n) de n'importe quelle fonction #.

Note - Ceci est applicable sur unix

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

os.wait()

Attend l'achèvement d'un processus enfant, et renvoie un tuple contenant son pid et l'indication du statut de sortie : un nombre de 16 bits, dont l'octet de l'octet de poids faible est le numéro du signal qui a tué le processus, et dont l'octet de poids fort est le l'octet de poids fort est l'état de sortie (si le numéro du signal est égal à zéro). de l'octet de poids faible est défini si un fichier de base a été produit.

Availability: Unix

.

16voto

user2589273 Points 1182

Vous pouvez utiliser

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

à la place. os.system ne renvoie que la valeur de l'erreur.

El os.popen est une enveloppe plus soignée pour subprocess.Popen comme on le voit dans le code source python.

12voto

Cez Points 2666

"Sous Unix, la valeur de retour est le statut de sortie du processus encodé dans le format spécifié pour wait(). Notez que POSIX ne spécifie pas la signification de la valeur de retour de la fonction C system() en C, la valeur de retour de la fonction fonction Python est dépendante du système".

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

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

4voto

sam Points 1742

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 est 0.

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