无需PYTHONPATH技巧,如何让子目录Python脚本导入父目录文件?
最优实现方案
针对你的文件结构,推荐两种合规且无需依赖PYTHONPATH的实现方式,按优先级排序:
1. 采用标准可安装包结构(推荐长期维护的项目)
把整个项目改造为Python标准包结构,步骤如下:
- 在根目录添加空的
__init__.py文件,scripts目录也添加空的__init__.py,最终结构:
myproject/ __init__.py a.py b.py c.py scripts/ __init__.py script1.py script2.py
- 在项目根目录创建
pyproject.toml文件,内容示例:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "myproject" version = "0.1.0" packages = ["myproject", "myproject.scripts"]
- 执行
pip install -e .以开发模式安装包,之后你可以在scripts的脚本里直接用绝对导入:
from myproject import a, b, c
这种方式完全符合Python包规范,不管你在系统哪个位置运行脚本,都能正常导入,适合长期维护的项目。
2. 动态添加父目录到模块搜索路径(适合快速临时场景)
如果不想改造包结构,可以在scripts下的脚本开头添加一段代码,动态获取父目录并加入Python的模块搜索路径:
import sys from pathlib import Path # 动态获取当前脚本所在目录的父目录(即项目根目录) parent_dir = Path(__file__).parent.parent sys.path.append(str(parent_dir)) # 现在可以直接导入根目录的文件 import a import b
这种方式不需要修改环境变量,也不用调整项目结构,适合快速验证或小型临时项目。
注意:如果使用相对导入(比如from .. import a),仅能在将项目当作包模块运行时生效(需在项目根目录执行python -m scripts.script1),直接运行script1.py会报错,因此不推荐这种方式。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

