使用相对/绝对路径运行Python脚本的差异问题排查
问题描述
运行Python 2.7脚本时遇到路径相关异常:
- 脚本路径:
c:\tmp\git\enigma\blah.py - 当前工作目录:
c:\tmp\otherdir - 执行
python ..\git\enigma\blah.py some_args(相对路径调用):脚本正常运行,subprocess.Popen调用的外部程序工作正常 - 执行
python c:\tmp\git\enigma\blah.py some_args(小写盘符绝对路径调用):脚本能启动,但subprocess.Popen调用的外部程序报错 - 两种调用方式都会在脚本内切换到相同目标目录,但结果完全不同
排查方向(除检查
sys.argv[0]外) - 验证工作目录切换结果:在脚本切换目录前后打印
os.getcwd(),对比两种调用方式下的路径是否完全一致(重点关注盘符大小写) - 对比环境变量差异:在脚本开头打印
os.environ中的关键变量(如PATH、PWD),看两种调用方式下是否有隐性差异 - 检查外部命令的路径生成逻辑:确认
subprocess.Popen调用的外部命令(如yarn)的路径是如何生成的,是否依赖脚本启动时的路径解析结果 - 测试路径大小写敏感性:用
os.path.abspath(__file__)打印脚本的绝对路径,对比两种调用方式下的输出是否存在大小写不同(尤其是盘符部分) - 排查权限或路径解析隐性问题:确认绝对路径调用时是否触发了不同的权限策略,或Windows系统对路径的隐性转换导致工具识别异常
问题根因
最终定位到脚本调用的yarn命令:Windows环境下yarn对路径的盘符大小写敏感:
- 相对路径调用时,脚本切换到的工作目录盘符为大写
C:\,符合yarn的路径识别要求 - 小写盘符的绝对路径调用时,脚本内生成的目标路径盘符为小写
c:\,yarn无法正确识别该路径,导致子进程异常 - 改用大写盘符的绝对路径
python C:\tmp\git\enigma\blah.py调用后,路径盘符为大写,yarn恢复正常工作
此问题并非Python本身的缺陷,而是第三方工具yarn的路径处理特性导致。
内容的提问来源于stack exchange,提问作者Jason S
相关产品推荐
相关产品推荐

