无法从子包访问顶级 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
我的目录结构如下:
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