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

Python 3.7下如何将utils目录设为包实现同级目录导入?

解决Python相对导入错误:将utils目录设为可导入包的永久方案

我来帮你梳理这个问题的解决方案——你遇到的是Python相对导入的典型场景,本质是脚本运行方式和包结构识别的问题。

先明确你的场景细节:
你的项目目录结构如下:

framework/
  __init__.py
  build/
  classifiers/
  extraction/
    extractionFile.py
  quality/
  utils/
    utilsFile.py

当你在extraction目录下直接运行extractionFile.py,使用相对导入代码:

from ..utils.utilsFile import functionName

会触发以下错误:

Traceback (most recent call last):
File "extractionFile.py", line 25, in
from ..utils.utilsFile import functionName
ImportError: attempted relative import with no known parent package

但如果在framework目录下运行该文件,改用绝对导入from utils.utilsFile import functionName就能正常工作。你需要一个永久解决方案,不考虑临时的sys.path.insert()方法,且仅在当前项目中生效。

方案1:遵循Python包规范运行脚本(官方推荐)

Python的相对导入设计初衷是服务于包内部的模块引用,而非直接运行子目录里的独立脚本。要让utils成为可跨同级目录导入的包,你可以这么做:

  • 确保framework目录下的__init__.py存在(空文件即可),这是标记该目录为Python包的必要条件。
  • 永远从framework的父目录出发,用模块方式运行你的脚本:
    python -m framework.extraction.extractionFile
    
    这种运行方式会让Python自动识别framework为顶层包,此时你在extractionFile.py中的相对导入代码就能正常工作了。

方案2:通过PYTHONPATH永久注册项目根目录(你最终采用的方法)

如果你更习惯直接运行子目录里的脚本,把framework目录加入Python的全局搜索路径是更便捷的永久方案:

  • 临时生效:在framework目录下执行以下命令(关闭终端后失效):
    DIR=$(pwd) && export PYTHONPATH="${PYTHONPATH}:$DIR"
    
  • 永久生效:将命令写入你的shell配置文件(比如~/.bashrc或~/.zshrc):
    echo 'export PYTHONPATH="$PYTHONPATH:/绝对路径/to/framework"' >> ~/.bashrc
    
    替换成你实际的framework绝对路径后,执行source ~/.bashrc或者重启终端,之后无论你在哪个目录运行extractionFile.py,都可以直接用from utils.utilsFile import functionName来导入模块,无需使用相对路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:33:12