Python / Flask-突然出现“ ImportError:未命名模块...”错误

时间:2019-01-01 01:42:04

标签: python python-3.x flask

我遇到了我认为是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上运行。而且,如果我不清楚,我的应用程序在进行更改/重新安装部门之前运行良好。

2 个答案:

答案 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 / -epip选项,用于放置到源目录的链接而不是复制相关文件;直接使用setup.py的相应模式是develop,即python setup.py develop

答案 1 :(得分:0)

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