无法从子包访问顶级 python 包

Can't access top level python package from sub packages

我的目录结构如下:

chatbot/
    __init__.py
    utils/
    __init__.py
    parser.py
    nlu/
        __init__.py
        training/
                __init__.py
                module.py

我想从 module.py 访问 parser.py。 我尝试使用 module.py:

中的这一行
from chatbot.utils import parser

我收到了这个错误:

ModuleNotFoundError: No module named 'chatbot'

任何指向我做错了什么的指针? 我正在使用 python3 并尝试将脚本 运行 作为 python3 nlu/training/module.py。 提前致谢!

我可以通过将 chatbot 包的父目录添加到 sys.path.

来解决问题

假设聊天机器人 python 包在 /home/my_project/chatbot/ 中,我添加了如下语句:

sys.path.append('/home/my_project') in module.py

这使得所有顶级 python 包对所有较低级别 python 包可见。

我认为解决此类问题的正确方法是:

  • 弄清楚你的顶级包和模块是什么以及它们在什么目录中
  • 切换到该目录
  • 使所有导入成为绝对的,即始终从顶级模块或包开始(而不是 from . import blah 之类的东西)
  • 使用 可执行模块 (python -m) 方式 运行 您的代码,例如 path/to/pythonX.Y -m top_level_package.executable_module (而不是 path/to/pythonX.Y top_level_package/executable_module.py)

如果顶级模块或包不在同一个目录中:

  • 正确打包您的库或应用程序并将它们安装在 站点包 中(最终成为 editable,也称为 开发模式).
  • 或者,作为最后的手段,在 PYTHONPATH 环境变量中收集包含 顶级 包和模块的其他目录,如下所示:
    • PYTHONPATH=path/to/alpha:path/to/bravo path/to/pythonX.Y -m top_level_package.executable_module