如何让Azure Pipeline运行脚本时相对路径正常工作?
Azure Pipeline 相对路径问题解决方案
问题背景
流水线运行gen.py时,依赖的sanity_check.py通过相对路径open('config.yml')读取配置文件,触发FileNotFoundError。目前仅能通过硬编码绝对路径临时解决,但需修改大量代码且无法兼容本地执行,需寻找低侵入性的兼容方案。
问题根源
Azure Pipeline执行python $(Build.Repository.LocalPath)\cfg\gen.py时,当前工作目录并非cfg目录,而是流水线默认的工作路径。此时相对路径config.yml会指向默认工作目录,而非cfg目录下的目标文件,导致找不到文件。
解决方案
方案1:切换工作目录后执行脚本(无需修改Python代码)
修改流水线中Run gen.py步骤,先切换到cfg目录再执行gen.py,让脚本的工作目录与本地执行一致:
- script: | set PYTHONPATH=$(Build.Repository.LocalPath)\cfg\00-config-tools-ext cd $(Build.Repository.LocalPath)\cfg python gen.py displayName: 'Run gen.py'
原理:切换到cfg目录后,所有相对路径都会基于该目录解析,和本地运行时的上下文完全一致,无需改动任何Python代码即可兼容本地与Pipeline环境。
方案2:通过环境变量兼容路径(仅需修改一行Python代码)
如果不想调整工作目录,可以利用已设置的CONFIG_PATH环境变量,在sanity_check.py中添加一行逻辑,优先读取环境变量,不存在时使用相对路径:
import yaml import os def check_sanity_config(): # 优先使用流水线环境变量,本地执行时自动 fallback 到相对路径 config_path = os.getenv('CONFIG_PATH', 'config.yml') with open(config_path, "r", encoding="utf-8") as stream: config_yml = yaml.safe_load(stream)
原理:本地执行时CONFIG_PATH环境变量不存在,自动使用相对路径;Pipeline中已配置该变量,直接读取绝对路径,仅需修改一行代码,侵入性极低。
内容的提问来源于stack exchange,提问作者petetheheat
相关产品推荐
相关产品推荐

