相对导入 \- ModuleNotFoundError:没有名为 x 的模块

新手上路,请多包涵

这是我第一次真正坐下来尝试 python 3,但似乎失败得很惨。我有以下两个文件:

  1. 测试.py
  2. 配置文件

config.py 中定义了一些函数以及一些变量。我已将其简化为以下内容:

配置文件

debug = True

测试.py

 import config
print (config.debug)

我也有一个 __init__.py

但是,我收到以下错误:

 ModuleNotFoundError: No module named 'config'

我知道 py3 约定是使用绝对导入:

 from . import config

但是,这会导致以下错误:

 ImportError: cannot import name 'config'

所以我不知道在这里做什么……非常感谢任何帮助。 :)

原文由 blitzmann 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 525
2 个回答

正如对原始帖子的评论中所述,这似乎是我出于某种原因使用的 python 解释器的问题,而不是 python 脚本的问题。我从 python.org 从 WinPython 包切换到官方 python 3.6,它工作得很好。感谢大家的帮助:)

原文由 blitzmann 发布,翻译遵循 CC BY-SA 3.0 许可协议

TL;DR: 您不能从您 执行 的文件中进行相对导入,因为 __main__ 模块不是包的一部分。

绝对导入- 导入可用的东西 sys.path

相对导入- 导入相对于当前模块的东西,必须是包的一部分

如果您以完全相同的方式运行两个变体,那么其中一个应该可以工作。这是一个示例,可以帮助您了解正在发生的事情。让我们添加另一个 main.py 文件,其整体目录结构如下:

 .
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py

让我们更新 test.py 看看发生了什么:

 # config.py
debug = True

 # test.py
print(__name__)

try:
    # Trying to find module in the parent package
    from . import config
    print(config.debug)
    del config
except ImportError:
    print('Relative import failed')

try:
    # Trying to find module on sys.path
    import config
    print(config.debug)
except ModuleNotFoundError:
    print('Absolute import failed')

 # main.py
import ryan.test

让我们先运行 test.py

 $ python ryan/test.py
__main__
Relative import failed
True

这里的“测试” __main__ 模块并且不知道任何关于属于包的信息。但是 import config 应该可以工作,因为 ryan 文件夹将添加到 sys.path

让我们运行 main.py 代替:

 $ python main.py
ryan.test
True
Absolute import failed

这里的测试在“ryan”包内,可以执行相关导入。 import config 失败,因为 Python 3 中不允许隐式相对导入。

希望这有所帮助。

PS:如果您坚持使用 Python 3,则不再需要 __init__.py 文件。

原文由 Igonato 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题