首页 > 解决方案 > 无法从子包访问顶级 python 包

问题描述

我有一个如下的目录结构:

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

我想parser.pymodule.py. 我尝试使用以下行module.py

from chatbot.utils import parser

我得到了这个错误:

ModuleNotFoundError: No module named 'chatbot'

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

标签: python-3.xpython-importpython-packaging

解决方案


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

  • 弄清楚你的顶级包和模块是什么以及它们在什么目录中
  • 切换到那个目录
  • 使您的所有导入都成为绝对的,即始终从顶级模块或包开始(而不是像这样的东西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

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

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

推荐阅读