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自动识别python -m framework.extraction.extractionFileframework为顶层包,此时你在extractionFile.py中的相对导入代码就能正常工作了。
方案2:通过PYTHONPATH永久注册项目根目录(你最终采用的方法)
如果你更习惯直接运行子目录里的脚本,把framework目录加入Python的全局搜索路径是更便捷的永久方案:
- 临时生效:在
framework目录下执行以下命令(关闭终端后失效):DIR=$(pwd) && export PYTHONPATH="${PYTHONPATH}:$DIR" - 永久生效:将命令写入你的shell配置文件(比如
~/.bashrc或~/.zshrc):
替换成你实际的echo 'export PYTHONPATH="$PYTHONPATH:/绝对路径/to/framework"' >> ~/.bashrcframework绝对路径后,执行source ~/.bashrc或者重启终端,之后无论你在哪个目录运行extractionFile.py,都可以直接用from utils.utilsFile import functionName来导入模块,无需使用相对路径。
内容的提问来源于stack exchange,提问作者Picolo
相关产品推荐
相关产品推荐

