![](/img/trans.png)
[英]how to fix Import Error: No module named... in python with VScode
[英]Python/Flask - suddenly getting "ImportError: No module named..." error
我遇到了我认为在 Python 应用程序中相当普遍的问题 - ImportError: No module named lib.handle_data
- 但我对 Python/Flask 生态系统的经验不足,无法真正理解为什么会发生这种情况,尤其是因为我的代码一直在工作,直到我做了一个小的调整并重新安装了一些依赖项。 好的,这就是它下降的方式......
我正在开发一个 Flask 应用程序,直到不久前,它运行良好。 我意识到我没有在setup.py
文件中包含依赖项的语义版本控制。 最初,该文件如下所示:
from setuptools import setup
setup(
name='my_app',
packages=['my_app'],
include_package_data=True,
python_requires='>3.6.4',
install_requires=[
'flask',
'gtfs-realtime-bindings',
'gunicorn',
],
)
我改成这样:
from setuptools import setup
setup(
name='my_app',
packages=['my_app'],
include_package_data=True,
python_requires='>3.6.4',
install_requires=[
'flask==0.12.2',
'gtfs-realtime-bindings==0.0.5',
'gunicorn==19.7.1',
],
)
然后只是为了确保一切正常,我运行了python setup.py install
并且一切似乎都正常 - 没有任何版本改变,因为这些是已经安装的。
但是,当我运行flask run
,服务器无法启动,并且出现错误:
import my_app.lib.handle_data as HandleData
ImportError: No module named lib.handle_data
并尝试通过 gunicorn 启动服务器
gunicorn my_app.my_app:app -b 0.0.0.0:8000
产生相同的错误(毫不奇怪,我敢肯定,只是全面)。
这是文件结构:
setup.py
my_app/
|
- __pycache__/
- __init__.py
- my_app.py
- lib/
|
- __pycache__/
- __init__.py
- handle_data.py
- request.py
my_app/__init__.py
的内容是:
from .my_app import app
而my_app/lib/__init__.py
是空的。
我是如何破坏我的应用程序的,我该如何解决这个问题?
Python 版本为 3.6.4,在 macOS Mojave 10.14 上运行。 如果我没有说清楚,在我进行此更改/重新安装 deps 之前,我的应用程序运行良好。
您应该在packages
添加"my_app.lib"
,因为否则将不会安装相应的子软件包和my_app.lib.*
模块。 您可以通过以下方式检查现有安装:
>>> import my_app
>>> my_app.__file__
'/path/to/virtualenv/lib/python3.6/site-packages/my_app/__init__.py'
现在检查相应的目录将显示lib
丢失。 如果将"my_app.lib"
添加到packages
则lib
目录(软件包)也将被安装。
至于为什么它在您没有更改软件包设置/结构的任何内容之前起作用的原因,我只能推测。 但是,安装过程本身可能会产生影响。 如果您之前以--editable
( -e
)模式(或python setup.py develop
) 1安装了该软件包,则您的环境将包含指向该软件包的源目录的my-app.egg-link
,而不是该软件包的副本相关文件。 这样, my_app.lib
当然不会丢失(因为它包含在源目录中)。 根据您的描述,您在应用更改后进行了“常规”安装,这要求packages
指定的完整结构完整(也使用--upgrade
会删除链接)。
1. --editable / -e
是pip
选项,用于放置到源目录的链接,而不是复制相关文件; 直接使用setup.py
develop
相应的模式,即python setup.py develop
。
这个问题已经被任何偶然发现这个问题的人回答了。 只是想节省别人的时间,如果您希望我发布声誉,我将其删除,您可以发布一个,我只是不想让别人花时间在回答的问题上
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.