You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python跨上下文导入问题:如何编写utilities1.py的正确导入语句

解决Python跨上下文导入的问题

针对你的项目结构,核心问题是直接运行script.py时,它的模块上下文和test.py调用时不一样,导致utilities1.py里的导入语句无法同时适配两种场景。下面给你几种靠谱的解决方案,按推荐程度排序:

方案1:使用相对导入 + 以模块方式运行script.py(最推荐)

这是Python官方推荐的包内导入方式,能完美适配两种场景:

  1. 在utilities1.py里用相对导入:
# utilities1.py
from . import utilities2
  1. 不要直接运行script.py,而是从项目根目录用模块运行方式启动:
python -m module.script

这样做的原因是:当你用-m参数运行时,Python会把项目根目录加入sys.path,并把script.py当作module包的子模块处理,此时相对导入from . import utilities2就能正确找到同目录下的utilities2.py。而test.py里只需要用绝对导入就能正常工作:

# test.py
from module import utilities1, utilities2

方案2:使用绝对导入 + 手动添加根目录到sys.path

如果坚持要直接运行script.py(比如python module/script.py或者进入module目录后运行python script.py),可以用这种方式:

  1. 在utilities1.py里用基于包名的绝对导入:
# utilities1.py
from module import utilities2
  1. 在script.py的最开头添加代码,把项目根目录(也就是module文件夹的父目录)加入sys.path:
# script.py
import sys
from pathlib import Path

# 获取项目根目录并添加到sys.path
root_dir = Path(__file__).parent.parent
sys.path.append(str(root_dir))

# 之后正常导入utilities1
import utilities1

这样不管是直接运行script.py,还是test.py导入模块,utilities1.py里的绝对导入都能找到utilities2.py。

方案3:条件导入(不推荐,应急用)

如果上面两种方案都不符合你的需求,可以用应急的条件导入方式,但这种方式容易出现模块冲突,不建议长期使用:

# utilities1.py
try:
    # 当作为包的子模块被导入时(比如test.py调用),用相对导入
    from . import utilities2
except ImportError:
    # 当直接运行script.py时,用同级导入
    import utilities2

这种方式会先尝试相对导入,如果失败(比如script.py被直接运行导致相对导入无效),就降级为同级导入。


最后提醒一下:尽量避免直接运行包内的脚本,用python -m 包名.脚本名的方式更符合Python的包规范,也能减少导入问题。

内容的提问来源于stack exchange,提问作者Jan Halsema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:01:55