商城首页欢迎来到中国正版软件门户

您的位置:首页 >Python同目录模块导入方法:相对导入与包结构详解

Python同目录模块导入方法:相对导入与包结构详解

  发布于2026-04-15 阅读(0)

扫一扫,手机访问

Python 中从同目录模块导入的正确方式:相对导入与包结构规范

本文详解如何在 Python 项目中正确实现同目录或子目录模块的导入,重点解决因包结构不规范导致的 ModuleNotFoundError,介绍相对导入语法、__init__.py 的作用及可执行脚本的最佳实践。

本文详解如何在 Python 项目中正确实现同目录或子目录模块的导入,重点解决因包结构不规范导致的 `ModuleNotFoundError`,介绍相对导入语法、`__init__.py` 的作用及可执行脚本的最佳实践。

在 Python 中,直接运行一个位于包内部的脚本(如 Utils/test.py)时,该脚本不会自动被视为包的一部分,Python 解释器也不会将其所在路径加入 sys.path。因此,即使目录中存在 __init__.py,import Utils.util 仍会失败——因为 Utils 并非当前 Python 进程可识别的顶层包,而是一个未被声明为“可导入包”的普通文件夹。

根本原因在于:Python 的模块导入机制依赖于 sys.path 和包的“入口上下文”。当你在 MyProject/ 根目录下执行 python -m Utils.test 时,Python 才会将 MyProject 视为顶层包;但若直接运行 python Utils/test.py,解释器会把 test.py 当作独立脚本启动,其 __name__ == '__main__',且 __package__ 为 None,此时无法使用相对导入(如 from .util import run),也会找不到绝对包名 Utils。

✅ 正确解决方案分三步:

  1. 确保包结构合规
    Utils/ 下必须有 __init__.py(可为空),且其父目录 MyProject/ 也应作为 Python 包根——推荐在 MyProject/ 下添加空 __init__.py(虽非强制,但显式声明更健壮)。

  2. 改用 -m 方式运行(推荐)
    在 MyProject/ 目录下执行:

    python -m Utils.test

    此时 test.py 被当作模块加载,__package__ 为 'Utils',可安全使用绝对导入

    # Utils/test.py
    from util import run  # ✅ 正确:util 是 Utils 的子模块
    # 或
    import util.run     # ✅ 同样有效
  3. 如需在 test.py 内部调用同级/子模块,优先用相对导入(仅限模块模式)
    若坚持在 test.py 中引用 util/run.py,且确保以 python -m Utils.test 启动,则可写:

    # Utils/test.py
    from .util import run  # ✅ 相对导入:. 表示当前包(Utils)
    # 或
    from .util.run import main

⚠️ 注意事项:

  • ❌ 不要直接运行 python Utils/test.py —— 这会破坏包上下文;
  • ❌ from .Utils import util 是错误的(test.py 已在 Utils 包内,. 指向 Utils,不存在 ./Utils);
  • ✅ 所有 __init__.py 文件必须存在(哪怕为空),否则 Python 不识别为包;
  • ✅ 可在 MyProject/ 下临时添加 __init__.py,并确保终端工作目录为 MyProject,再执行 -m 命令。

? 总结:该问题本质是 “Python 包执行上下文缺失”,标准术语为 “Running a module as script vs. as module”。最佳实践是始终通过 python -m package.module 方式运行包内脚本,既符合 Python 设计哲学,又能无缝支持绝对与相对导入,避免路径硬编码和 sys.path 手动修改等反模式。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注