为什么我的代码会抛出“NameError: name 'ModuleNotFoundError' is not defined”错误?

12
我正在本地安装以下 Flask 应用程序:SolarPi。由于我必须安装 raven 包并且在 Github 存储库中有未回复的拉取请求和问题,因此我假设该代码已经损坏且不再维护。尽管我在 Flask 和 Python 上缺乏熟练技能,但我决定尝试运行它。
当我运行 $ (.env) python manage.py server 代码会抛出以下错误:
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

如有需要,可以在文件numeric.py中进行检查

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

ModuleNotFoundError 是一个异常处理程序。

这里有点棘手的是,当本地或全局名称未找到时引发的异常 "NameError" 捕获了另一个内置异常抛出的异常,在这种情况下为 "ModuleNotFoundError"。由于这些异常是内置的,我假设代码只是写给 Python 3 而不是所述的 Python 2。我是否遗漏了什么东西,以至于不必重构整个代码?


Python 3.x和Python 2.7本质上是两种不同的语言。3.x会出现“ModuleNotFoundError”错误,而2.7则不会。你正在使用2.7版本。 - DYZ
我明白了。根据指示,程序员要求我们使用Python2,但他的代码中使用了ModuleNotFoundError,这是Python3中的内容。我应该重写代码以回退到之前的版本吗?如果是,你知道我该怎么做吗? - pedrez
如果ModuleNotFoundError是唯一的问题,我猜你可以创建一个新的异常类并使用该名称? - DYZ
2
你不能使用ImportError吗?它是兼容Python2的。 - FrenchMasterSword
我已经浏览了源代码,没有看到任何在Python 3中无法运行的内容。 - roganjosh
@FrenchMasterSword 我尝试了你的建议,它起作用了! - pedrez
3个回答

14

仅澄清评论:像许多人说的那样,ModuleNotFoundError仅适用于Python 3.6及更高版本,但必须使用Python 2。然而,ImportError异常在Python 2和3中都可用,只是不太精确。

ModuleNotFoundError替换为ImportError应该可以解决问题。


3
答案需要更正:ModuleNotFoundError 错误消息从 Python3.6 开始可用。 - mikkokotila

2
如果您仍在使用Python 3.5并遇到问题,那么...
    NameError: name 'ModuleNotFoundError' is not defined

例如,在运行sphinx-build或pipdeptree或在您自己的代码中时,请前往PyPi并下载安装模块"importlib-metada",该模块的最新版本为“2”系列,即2.1.0。
importlib-metadata的1系列和2系列版本包括一个名为"compat.py"的文件,其中提供了缺失的'ModuleNotFoundError'功能。
请勿使用更新/更高的3系列版本,因为这些版本适用于Python版本3.6或更高版本,因此不再在"compat.py"文件中包含ModuleNotFoundError代码。

1
问题不在于缺少模块,而是缺少异常类。以下代码:
try:
    import numpy
    use_numpy()
except ModuleNotFoundError:
    pass

这段代码应该尝试导入 numpy 模块,但如果失败了,仅忽略错误并继续执行 (pass = 不执行任何操作)。

然而,代码试图捕获 ModuleNotFoundError 异常 - 在 Python 2.7 中不存在。

只需改用 Python 3 运行代码即可。


我尝试了这个解决方案,但是它报错了 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' 。在我的环境中无法工作。 - pedrez
这太令人困惑了!我可以看到ModuleNotFoundError,因为我运行了python3,这是有道理的。但还是很困惑! - pedrez
1
看起来你为你的Flask脚本创建了一个虚拟环境,其中包含所有模块和一个Python2实例。当你使用Python3运行它时,它找不到虚拟环境中的任何模块。最简单的选择可能是创建一个新的Python3虚拟环境,在其中安装所有内容,并重试。 - Danielle M.
这条建议在不久的将来可能会很有用。谢谢分享! - pedrez
我认为这不是Python 2/3的问题,而是Python <3.6的问题。 - mikkokotila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接