代码之家  ›  专栏  ›  技术社区  ›  skwidbreth

python/flask-突然出现“importerror:no module named…”错误

  •  1
  • skwidbreth  · 技术社区  · 6 年前

    我正在遇到一个我认为在Python应用程序中相当常见的问题。- ImportError: No module named lib.handle_data -但我对python/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 via启动服务器

    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。

    2 回复  |  直到 6 年前
        1
  •  2
  •   a_guest    6 年前

    你应该增加 "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 遗失了。如果添加 “MyAppApp.LIB” 包装 然后 国际清算银行 目录(包)也将被安装。

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


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

        2
  •  0
  •   RedPython    6 年前

    这个问题已经被其他任何人回答了,他们偶然发现了这个信条给一位客人。只是想节省别人的时间,顺便说一句,如果你想从我这里得到声誉,我会删除它,你可以发布一个。我只是不想有人把他们的时间花在回答问题上。