web-dev-qa-db-fra.com

Python le bloc try ne capture pas les exceptions os.system

J'ai ce code python:

import os
try:
  os.system('wrongcommand')
except:
  print("command does not work")

Le code imprime:

wrongcommand: command not found

Au lieu de command does not work. Est-ce que quelqu'un sait pourquoi il n'imprime pas mon message d'erreur?

21
Cinder

Si vous souhaitez qu'une exception soit levée lorsque la commande n'existe pas, vous devez utiliser subprocess:

 import subprocess
 try:
     subprocess.call(['wrongcommand'])
 except OSError:
     print ('wrongcommand does not exist')

À bien y penser, vous devriez probablement utiliser subprocess au lieu de os.system en tous cas ...

27
mgilson

Parce que os.system () indique un échec via le code de sortie de la méthode

  • valeur de retour == 0 -> tout va bien
  • valeur de retour! = 0 -> une erreur

Le code de sortie de la commande appelée est directement renvoyé à Python.

Il existe une documentation vous indiquant que os.system () déclencherait une exception en cas d'échec. os.system () appelle simplement l'appel système underlaying () du système d'exploitation et renvoie sa valeur de retour.

Veuillez lire la documentation os.system () attentivement.

14
Andreas Jung

Il y a deux problèmes dans votre extrait de code. Tout d'abord, ne faites pas simplement try: ... except:, Soyez toujours précis quant à l'exception que vous voulez gérer. Sinon, votre programme avale tout type d'erreur, même celles auxquelles vous ne vous attendez pas. Dans la plupart des cas, cela entraînera un comportement inattendu à un autre moment de l'exécution.

De plus, les appels os.system() doivent la plupart du temps être remplacés par leurs homologues du module subprocess.

Pour voir ce qui ne va pas, omettez le bloc try/except et regardez réellement le traceback/exception. Comme d'autres l'ont souligné, vous remarquerez qu'il n'y a pas d'exception dans votre cas, c'est pourquoi votre chaîne personnalisée n'est pas imprimée.

Conclusion: pensez aux exceptions spécifiques qui peuvent se produire dans votre bloc de code. Réfléchissez bien à ceux que vous attendez pour certaines raisons et gérez-les de manière appropriée. Ne manipulez pas ceux auxquels vous ne vous attendez pas.

3
Jan-Philip Gehrcke

wrongcommand: command not found est la sortie du Shell os.system utilise pour appeler la commande. os.system n'a pas levé d'exception

EDIT: édité par copier-coller une partie du commentaire de mgilson

1
gefei

Il existe un autre moyen plus simple:

import os

def dat():
        if os.system('date') == 0:
            print("Command successfully executed")
        else:
            print("Command failed to execute")

dat()
0
Preetesh Sharma

Bien que le sous-processus puisse être votre meilleur ami. os.system est toujours utile quelque part, en particulier pour le programmeur en mode C/C++.

Par conséquent, le code sera ci-dessous.

import os
try:
  os_cmd = 'wrongcommand'
  if os.system(os_cmd) != 0:
      raise Exception('wrongcommand does not exist')
except:
  print("command does not work")

0
Shouton Eulle