【问题标题】:Cannot import Python module in same package无法在同一包中导入 Python 模块
【发布时间】:2021-06-24 06:16:05
【问题描述】:

我有一个 Python 3.9.2 项目,其目录结构如下:

lib/
├─ mod1.py
├─ mod2.py
├─ __init__.py
main.py

/main.py,我有from lib import mod1。在/lib/mod1.py,我有import mod2。当我运行/main.py 时,我收到以下错误:

Traceback (most recent call last):
  File "/main.py", line 1, in <module>
    from lib import mod1
  File "/lib/init.py", line 1, in <module>
    import mod2
ModuleNotFoundError: No module named 'mod2'

为什么会这样?当我将/lib/mod1.py 中的代码更改为from lib import mod2 时,代码工作正常,但我不明白为什么会修复它。由于mod1.pymod2.py 都在同一个目录中,我不应该能够按照我最初尝试的方式导入/lib/mod2.py 吗?

【问题讨论】:

    标签: python python-3.x python-import python-module python-packaging


    【解决方案1】:

    /lib/mod1.py,你可能想做:

    # relative import - entire module
    from . import mod2
    
    # relative import - specific piece
    from .mod2 import foo 
    

    # absolute import - entire module
    from lib import mod2
    
    # absolute import - specific piece
    from lib.mod2 import foo
    

    在 Python 中导入东西的正确方法确实很棘手,因为它取决于你从哪里运行脚本。

    • 如果从根目录运行代码,import mod2 会出现问题,但是
    • 如果您要从 lib 内部运行 /lib/mod1.py(说它可以运行),那么 import mod2 将是正确的,而上述替代方案会导致错误。

    【讨论】:

    • 当我使用from . import mod2 时它对我有用,但不适用于import .mod2。如果我想确保脚本可以运行,是否必须使用if __name__ == "__main__" 来检查它是否作为独立脚本运行?
    • 啊,这是一个语法错误。固定的!您不需要if __name__ == "__main__" 来使脚本可以运行,但这是一个很好的做法。见:stackoverflow.com/questions/419163/what-does-if-name-main-do
    • 对不起,我不清楚。是否可以使用if __name__ == "__main__" 来检查是否运行import mod2(正如您在帖子底部所说,这可能会导致错误取决于脚本的运行方式)?
    猜你喜欢
    • 2018-12-27
    • 2019-07-31
    • 2012-05-25
    • 2014-08-09
    • 2020-07-02
    • 2022-09-27
    • 2018-04-29
    • 2023-03-07
    相关资源
    最近更新 更多