繁体   English   中英

Python/Flask - 突然出现“ImportError: No module named...”错误

[英]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"添加到packageslib目录(软件包)也将被安装。

至于为什么它在您没有更改软件包设置/结构的任何内容之前起作用的原因,我只能推测。 但是,安装过程本身可能会产生影响。 如果您之前以--editable-e )模式(或python setup.py develop1安装了该软件包,则您的环境将包含指向该软件包的源目录的my-app.egg-link ,而不是该软件包的副本相关文件。 这样, my_app.lib当然不会丢失(因为它包含在源目录中)。 根据您的描述,您在应用更改后进行了“常规”安装,这要求packages指定的完整结构完整(也使用--upgrade会删除链接)。


1. --editable / -epip选项,用于放置到源目录的链接,而不是复制相关文件; 直接使用setup.py develop相应的模式,即python setup.py develop

这个问题已经被任何偶然发现这个问题的人回答了。 只是想节省别人的时间,如果您希望我发布声誉,我将其删除,您可以发布一个,我只是不想让别人花时间在回答的问题上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM