为什么我的代码会引发“ NameError:未定义名称'ModuleNotFoundError'”错误?

时间:2019-01-11 19:44:22

标签: python

我正在本地安装以下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。我是否在这里遗漏了一些不会导致重构整个代码的东西?

3 个答案:

答案 0 :(得分:2)

问题不是缺少的模块,而是缺少的异常类。以下代码:

try:
    import numpy
    use_numpy()
except ModuleNotFoundError:
    pass

应该尝试导入numpy,但是如果失败,则忽略该失败并继续(pass =不执行任何操作)。

但是,代码试图捕获异常ModuleNotFoundError-python2.7中不存在。

只需使用python3运行代码即可。

答案 1 :(得分:2)

只是为了澄清注释:正如许多人所说,ModuleNotFoundError仅在Python 3中可用,但必须使用Python 2。但是ImportError异常在Python 2和3中可用,它的精确度略低。

ModuleNotFoundError替换为ImportError应该可以。

答案 2 :(得分:2)

如果您仍在使用Python 3.5并遇到问题

@Autowired
ApplicationContext ctx

...

SomeController controller = ctx.getBeanNamesForType(SomeController)

例如,当运行sphinx-build或pipdeptree或从您自己的代码运行时,然后转到PyPi并下载并安装模块“ importlib-metada”,这是“ 2”系列(即2.1.0)中的最新版本。

importlib-metadata的版本1和2系列包括一个“ compat.py”文件,该文件提供了缺少的“ ModuleNotFoundError”功能。

请勿使用3系列的更高/更高版本,因为这些版本适用于python 3.6或更高版本,因此不再在“ compat.py”文件中包含ModuleNotFoundError代码。

相关问题