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