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

Python3.9中如何用相对路径跨目录引用模块?

Python跨目录模块相对路径导入解决方案

目录结构

apps/sockstunnel/sockstunnel
├── api.py
├── db.py
├── exceptions.py
├── flags.py
├── frame.py
├── __init__.py
├── libfix.py
├── notification.py
├── protocols.py
├── proxy_router.py
└── service.py
auto_tasks/FEXT_STACKER/
├── docker-compose.yml
├── Dockerfile
├── licenses
├── README
├── stacker.py
└── tmp

注:apps与auto_tasks处于同一父目录下,需在auto_tasks/FEXT_STACKER/stacker.py中导入apps/sockstunnel/sockstunnel/protocols.py的逻辑,Python版本为3.9。

问题分析

你尝试的第一种相对路径写法失败,原因是/../../apps/sockstunnel是绝对路径格式(开头带/),Python会从系统根目录向上查找,而非相对于stacker.py所在目录定位,自然找不到目标路径。

可行的相对路径实现方案

方案1:基于脚本路径动态构造目标路径

通过获取当前脚本的绝对路径,向上追溯到apps和auto_tasks的共同父目录,再拼接目标路径添加到sys.path:

import os
import sys

# 获取stacker.py所在目录的绝对路径
current_script_dir = os.path.dirname(os.path.abspath(__file__))
# 向上跳转两级,到达apps和auto_tasks的共同父目录
project_root = os.path.dirname(os.path.dirname(current_script_dir))
# 将apps/sockstunnel目录添加到Python模块搜索路径
sys.path.append(os.path.join(project_root, "apps", "sockstunnel"))

# 现在可以正常导入目标模块
from sockstunnel import protocols

方案2:直接导入完整包路径(更规范)

同样先定位到共同父目录,将其添加到sys.path后,直接用完整包结构导入,避免命名冲突:

import os
import sys

# 定位到apps和auto_tasks的共同父目录
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../"))
# 将父目录插入到搜索路径最前面,确保优先加载本地模块
sys.path.insert(0, project_root)

# 按完整包路径导入目标模块
from apps.sockstunnel.sockstunnel import protocols

额外提示

如果你的项目是长期维护的工程,推荐将共同父目录设为Python的包目录(在该目录下创建空的__init__.py文件),配合上述路径构造方法,能让模块导入逻辑更清晰、更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:32:57