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?
3 Réponses :
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.
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.
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.
Cette réponse doit être corrigée; ModuleNotFoundError est disponible à partir de Python3.6.
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".
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é!