Python符号链接执行时导入路径不符预期的解决方法问询
解决Python符号链接脚本导入同目录模块的问题
项目目录结构
project/ ├── my_input.py ├── run_me.py └── test ├── my_input.py └── run_me.py -> ../run_me.py
问题说明
run_me.py脚本会导入my_input.py的内容,期望通过符号链接的test/run_me.py导入同目录的test/my_input.py,但实际在test目录执行./run_me.py时,导入的是根目录的my_input.py,输出为导入自my_input.py,而非预期的导入自test/my_input.py。
现有代码示例
- 根目录
run_me.py代码:
#!/usr/bin/env python3 from my_input import *
- 根目录
my_input.py内容:
print("导入自my_input.py")
test/my_input.py内容:
print("导入自test/my_input.py")
解决方法
方法1:修改脚本导入路径(推荐)
修改run_me.py,让脚本优先从符号链接所在目录查找模块:
#!/usr/bin/env python3 import os import sys # 获取脚本的真实路径(解析符号链接) script_real_path = os.path.realpath(__file__) # 获取脚本所在目录 script_dir = os.path.dirname(script_real_path) # 将该目录加入sys.path最前端,确保优先查找 sys.path.insert(0, script_dir) from my_input import *
修改后,在test目录运行./run_me.py,会优先加载test目录下的my_input.py,输出预期内容。
方法2:改用Python包结构与相对导入
- 在
project和test目录下分别创建空的__init__.py文件,将项目转为Python包结构; - 修改
run_me.py的导入语句为相对导入:
#!/usr/bin/env python3 from .my_input import *
- 在project目录下以模块方式运行脚本:
python3 -m test.run_me
方法3:临时设置环境变量
无需修改代码,在test目录运行脚本前,将当前目录加入PYTHONPATH:
PYTHONPATH=. ./run_me.py
内容的提问来源于stack exchange,提问作者roro
相关产品推荐
相关产品推荐

