【问题标题】:ModuleNotFoundError in a Python project using packages使用包的 Python 项目中的 ModuleNotFoundError
【发布时间】:2019-04-30 15:35:48
【问题描述】:

我有一个 Python 项目(python 3.6),它的包结构相当简单。我的目标是拥有一个包含模块的包,这些模块可以在其他包中重用。这是结构:

    my_project                   
    ├── /docs           
    ├── /src
    │   ├── __init__.py                
    │   ├── /common
    │   |    |── __init__.py      
    │   |    |── common_module.py
    │   ├── /packageA
    │   |    |── __init__.py      
    │   |    |── modA.py

问题是当我在modA.py 中执行以下操作时:

    from src.common import common_module as cm

我收到以下错误:ModuleNotFoundError: No module named src.common

到目前为止我尝试过的是

  • 确保我有一个正确的包结构,如https://docs.python.org/3/tutorial/modules.html
  • export PYTHONPATH=<path_to_project>/src使用的虚拟环境中扩展PYTHONPATH
  • /my_project 中也放置一个__init__.py
  • 阅读 StackOverflow 上的其他问题,但没有一个提供解决方案。他们中的一些人正在使用 sys.path 做一些骇人听闻的事情,据说即使可行,这也不是一个好的解决方案。

这些都不起作用,我已经为这个问题苦苦挣扎了一段时间,所以任何建议都将不胜感激。

【问题讨论】:

    标签: python package importerror


    【解决方案1】:

    为了使此导入工作,PYTHONPATH 需要为 .../my_project,而不是 .../my_project/src

    【讨论】:

    • 解决了 - 感谢您的快速回答!我只是对从同一个包中导入模块进行了跟进。如果在/common 中我们有另一个名为helper.py 的模块,我现在无法使用简单的import helperhelper 导入common_module,但需要提供完整路径为from src.common import helper。为什么会这样,为什么我之前可以简单地导入?
    • 导入模块时,导入中的第一个名称必须是 PYTHONPATH 中目录的直接子级。例如,如果你的 PYTHONPATH 是/home/petar/modules,并且你想导入/home/petar/modules/car/engine.py 模块,你会说import car.engine。在您的问题中,您将 PYTHONPATH 更改为高一个目录,因此您必须将导入更改为也开始高一个目录。
    • 感谢您的详尽解释 - 这确实有助于更好地了解 python 路径。
    【解决方案2】:

    是的,您应该将__init__.py 放入project
    然后export PYTHONPATH = <LOCAL_PATH_TO_...>/project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-12
      • 2021-12-26
      • 2019-04-10
      • 2020-11-10
      • 2018-08-03
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多