我遇到了我认为是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上运行。而且,如果我不清楚,我的应用程序在进行更改/重新安装部门之前运行良好。
答案 0 :(得分:2)
您应将"my_app.lib"
添加到packages
,因为否则将不会安装相应的子软件包和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
。
答案 1 :(得分:0)
这个问题已经被任何偶然发现这个问题的人回答了。只是想节省别人的时间,如果您希望我发布声誉,我将其删除,您可以发布一个,我只是不想让别人花时间在回答的问题上