gpt4 book ai didi

python - 模块未找到错误 : No module named 'sib1'

转载 作者:行者123 更新时间:2023-12-04 14:51:05 25 4
gpt4 key购买 nike

我有一个如下所示的项目层次结构,当我运行 python src/bot/main 时,我没有收到任何错误。而如果我运行 python -m src.bot.main 我得到了错误。为什么?

这是我的文件层次结构:

MyProject
└── src
├── __init__.py
├── bot
│   ├── __init__.py
│   ├── main.py
│   └── sib1.py
└── mod
├── __init__.py
└── module1.py

这是main.py的内容:

import sys


if __name__ == "__main__":

# sys.path will print the parent folder.
print(sys.path, end="\n\n")

# my problem is on this line.
import sib1
sib1.test()

错误:

Traceback (most recent call last):
File "/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/Users/me/Desktop/test_py/src/bot/main.py", line 16, in <module>
import sib1
ModuleNotFoundError: No module named 'sib1'

到目前为止我得出的一些结论:

Since the output of sys.path in both cases include /Users/me/Desktop/MyProject, the reason should not related to scope?


python -m src.bot.mainpython src/bot/mainsys.path 的输出:

(test) ✔ me Desktop/test_py % python -m src.bot.main
['/Users/me/Desktop/test_py', '/usr/local/Caskroom/miniconda/base/envs/test/lib/python39.zip', '/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.9', '/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.9/lib-dynload', '/usr/local/Caskroom/miniconda/base/envs/test/lib/python3.9/site-packages']

最佳答案

我会尽量把自己的每一个困惑都以问答的形式进行澄清,并整理@Brain的评论,途中:


Q1:当我运行 python src/bot/main 时,我没有遇到任何错误。

sys.path 将包括包含文件 main.py当前目录,即解释器将看到文件 我的项目/src/bot:

import sib1

(逻辑上)等同于:

import /path/to/MyProject/src/bot/sib1.py

因此,没有错误。

但这叫做 IMPLICIT-RELATIVE-IMPORT,应该只在主脚本上使用。参见 Example .


Q2:当我运行 python -m src.bot.main 时出现错误。为什么?

现在是引用@Brain 有值(value)的(第一条)评论的时候了:

Using python -m src.bot.main tells Python that src is a top-level package. Everything below src in the directory structure will be considered submodules/subpackages of src. The proper name for sib1 under that organization is src.bot.sib1. No top-level module named sib1 exists as far as Python is concerned.

(我强调的)

所以:

  • -m 选项将为您要访问的文件提供一些上下文信息( details ,我建议您完全阅读前两个高赞成票的答案)运行。
  • 现在每个不以 src. 开头的绝对(导入)路径都将被视为内置第三方安装在您的虚拟环境中的库。因为我没有安装任何名为 sib1 的包,所以你得到了错误。 (忽略当前目录包含在 sys.path 中。我猜这是出于兼容性原因。记住我们不想要 IMPLICIT-RELATIVE-IMPORT 在 python3)
  • 您可以使用相对路径,但您不应该离开 src(因为src顶级包在执行中)通过前置太多的

例如,这将起作用:

from . import sib1
from ..mod import module1 # The `..` is equivalent to the MyProject/src.

module1.hello()
sib1.test()

最后,不要通过插入许多 if __name__ == '__main__' 来测试您的包。使用专业工具执行此操作:

If you only need to run submodules for testing purpose, you could consider using more robust testing tools like doctest (lightweight) or unittest (heavyweight).

关于python - 模块未找到错误 : No module named 'sib1' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69095357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com