6
votes

Pourquoi mon code génère-t-il l'erreur "NameError: name 'ModuleNotFoundError' is not defined"?

J'installe localement l'application Flask suivante: SolarPi . Comme je devais installer le package raven et qu'il y avait des demandes d'extraction et des problèmes sans réponse sur le dépôt github, j'ai supposé que le code était cassé et n'était plus maintenu. Malgré mon manque de maîtrise de Flask et Python, j'ai décidé de tenter le coup et d'essayer de le faire fonctionner.

Quand je cours

$ (.env) python manage.py server

Le code renvoie l'erreur suivante:

from math import degrees, cos, sin, radians, tan, pi
from math import acos, atan, asin, atan2, exp, e

current_mod = 'math'


def globals_import_from(module, name, name_as):
    """
    Does "from <module> import <name> as <name_as>" (globally)
    """
    ...
    ...
    Bunch of defs
    ...
    ...

try:
    import numpy
    use_numpy()
except ModuleNotFoundError:
    pass

Comme il est possible de vérifier sur le fichier numeric.py

Traceback (most recent call last):
  File "manage.py", line 9, in <module>
    from solarpi.app import create_app
  File "/home/path/solarpi/solarpi/app.py", line 7, in <module>
    from solarpi import public, weather, charts, statistics, tables
  File "/home/path/solarpi/solarpi/public/__init__.py", line 4, in <module>
    from . import views
  File "/home/path/solarpi/solarpi/public/views.py", line 11, in <module>
    from solarpi.public.helper import get_operating_days
  File "/home/path/solarpi/solarpi/public/helper.py", line 4, in <module>
    from pysolar.util import get_sunrise_sunset
  File "/home/path/solarpi/.venv/lib/python2.7/site-packages/pysolar/__init__.py", line 1, in <module>
    from . import \
  File "/home/path/solarpi/.venv/lib/python2.7/site-packages/pysolar/radiation.py", line 21, in <module>
    from . import numeric as math
  File "/home/path/solarpi/.venv/lib/python2.7/site-packages/pysolar/numeric.py", line 140, in <module>
    except ModuleNotFoundError:
NameError: name 'ModuleNotFoundError' is not defined

le ModuleNotFoundError n'est qu'une clause d'exception.

Ce qui est délicat ici, c'est le fait que l'exception "NameError", qui est levée lorsqu'un nom local ou global n'est pas trouvé, intercepte une exception lancée par une autre exception intégrée, dans ce cas "ModuleNotFoundError". Étant donné que ces exceptions sont intégrées, j'ai supposé que le code était simplement écrit en python 3 et non en python 2 comme indiqué. Est-ce que je manque quelque chose ici qui ne conduirait pas à refactoriser tout le code?


6 commentaires

Python 3.x et Python 2.7 sont essentiellement deux langages différents. 3.x a ModuleNotFoundError . 2.7 ne le fait pas. Vous utilisez 2.7.


Oui, je comprends cela. D'après les instructions, le codeur nous demande d'utiliser python2 mais sur son code, il utilise ModuleNotFoundError qui provient de python3. Suis-je supposé réécrire le code pour revenir à la version précédente? Si oui, savez-vous comment je ferais cela?


Si ModuleNotFoundError est le seul problème, je suppose que vous pouvez créer une nouvelle classe d'exception avec ce nom?


Vous ne pouvez pas utiliser ImportError place? Il est compatible avec python2.


J'ai parcouru le code source et je ne vois rien qui ne fonctionne pas dans Python 3


@FrenchMasterSword J'ai essayé votre suggestion et cela a fonctionné!


3 Réponses :


1
votes

Le problème n'est pas un module manquant, c'est une classe d'exception manquante. Le code suivant:

try:
    import numpy
    use_numpy()
except ModuleNotFoundError:
    pass

Est censé essayer d'importer numpy , mais s'il échoue, il suffit d'ignorer cet échec et de continuer ( pass = ne rien faire).

Cependant, le code tente d'attraper l'exception ModuleNotFoundError - qui n'existe pas dans python2.7.

Exécutez simplement votre code avec python3 à la place.


5 commentaires

J'ai essayé cette solution et elle crie python3 manage.py server Traceback (most recent call last): File "manage.py", line 6, in <module> from flask_script import Manager, Shell, Server ModuleNotFoundError: No module named 'flask_script' . Ça ne marche pas de mon côté.


C'est tellement déroutant! Ici, je peux voir le ModuleNotFoundError qui a du sens puisque j'ai exécuté python3. Mais toujours déroutant!


Il semble que vous créez un virtualenv pour votre script flask, qui contient tous les modules et une instance python2. Lorsque vous l'exécutez avec python3, il ne trouve aucun des modules à l'intérieur de votre virtualenv. L'option la plus simple est probablement de créer un nouveau virtualenv python3, d'installer tout ce qu'il contient et de réessayer.


Ce conseil pourrait être utile dans un proche avenir. Merci d'avoir partagé! 7


Je ne pense pas que ce soit python 2/3, mais python <3.6 compte.



9
votes

Juste pour clarifier les commentaires: comme beaucoup l'ont dit, ModuleNotFoundError n'est disponible que dans Python 3.6 et les versions ultérieures, mais Python 2 doit être utilisé. Cependant, l'exception ImportError est disponible dans Python 2 et 3, elle est juste un peu moins précise.

Le remplacement de ModuleNotFoundError par ImportError devrait fonctionner.


1 commentaires

Cette réponse doit être corrigée; ModuleNotFoundError est disponible à partir de Python3.6.



0
votes

Si vous êtes toujours sur Python 3.5 et rencontrez le problème

    NameError: name 'ModuleNotFoundError' is not defined

par exemple lorsque vous exécutez sphinx-build ou pipdeptree ou à partir de votre propre code, allez dans PyPi et téléchargez et installez le module "importlib-metada", dernière version de la série "2" à savoir 2.1.0.

Les versions 1 et 2 des séries de métadonnées importlib incluent un fichier "compat.py" qui fournit la fonctionnalité "ModuleNotFoundError" manquante.

N'utilisez pas les versions plus récentes / supérieures de la série 3 car elles sont pour python version 3.6 ou supérieure et n'incluent donc plus le code ModuleNotFoundError dans le fichier "compat.py".


0 commentaires