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
相关产品推荐
相关产品推荐

