Python中如何正确导入上级目录中的模块?

项目结构:

Project
    \app
    config.py
    \sdk\api\demo.py

Project 在测试机和生产机中的系统路径不一样,所以不能写绝对路径。
要在 demo.py 中调用 config.py 中的配置参数 PARAM 要怎么写 from ... import PARAM 的路径?

# config.py

PARAM = foo


Python中如何正确导入上级目录中的模块?

11 回复

当前目录是. 上级目录是… 吧


在Python里导入上级目录的模块,你得先让解释器知道去哪儿找。直接import是行不通的,因为默认的搜索路径(sys.path)里没有上级目录。

最直接的办法就是动态修改sys.path。比如,你的项目结构是这样的:

project/
├── utils/
│   └── helper.py
└── scripts/
    └── main.py

scripts/main.py里,你想导入utils/helper.py,可以这么干:

import sys
import os

# 获取当前文件(main.py)所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 获取上级目录(project)的路径
parent_dir = os.path.dirname(current_dir)
# 将上级目录添加到sys.path的开头
sys.path.insert(0, parent_dir)

# 现在可以导入了
from utils import helper

# 使用模块
helper.some_function()

注意:用sys.path.insert(0, ...)把它加在开头,能确保优先从这个路径搜索,避免和标准库或第三方包重名时出问题。不过,在大型项目或者打包分发时,更规范的做法是把它做成一个可安装的包(用setup.pypyproject.toml),或者用相对导入(如果模块在同一个包内)。对于简单的脚本或者临时调试,修改sys.path是最快最实用的方法。

总结:改sys.path最省事。

<br>import sys<br>sys.path.append("..")<br>

\sdk\api…<a target="_blank" href=“http://demo.py” rel=“nofollow noopener”>demo.py 中间路径好多层,我省略了只写了一层 \api\
全部用 . 表示,估计有 五六个 … ,会失效吗?

sys.path.append("…") 超出两个 … 的 append,会有用吗?

#4 你把 project 路径添加到 path 里, 然后直接 import config 就可以了

#5 用 os.path 动态计算出 project 的绝对路径, 不要硬编码一个绝对路径就能解决你说的这个"Project 在测试机和生产机中的系统路径不一样"的问题了

对的。只需要添加项目根目录到 PATH 就可以了




这个 demo 点 py 的路径已经被我 sys.path.append("./sdk/api/") 过了,然后,我想在这个 demo 点 py 中写个函数,要调用 上层的 config 点 py 中的 PARAM,( project 的路径已经添加到 path 里了)导致在 demo 点 py 中直接 import config 就变成了是在 append()过的路径中导入了。

请使用 package 机制

直接从项目根目录开始就可以了

回到顶部