我的 Azure Pipeline 存在问题。管道本身非常简单,其目的是在示例中运行 gen.py:
# azure-pipelines.yml
trigger:
- master
pool:
vmImage: 'windows-latest'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.x'
addToPath: true
- script: |
python.exe -m pip install --upgrade pip
python.exe -m pip install setuptools
pip install -r $(Build.Repository.LocalPath)\requirements312.txt
displayName: 'Install dependencies'
- script: |
set PYTHONPATH=$(Build.Repository.LocalPath)\cfg\00-config-tools-ext
set CONFIG_PATH=$(Build.Repository.LocalPath)\cfg\config.yml
python $(Build.Repository.LocalPath)\cfg\gen.py
displayName: 'Run gen.py'
程序 cfg/gen.py 依赖于同一目录 (cfg) 中的其他程序 (.yml/.py),例如 cfg/00-config-tools-ext/sanity_check.py。
gen.py 像这样调用 sanity_check.py:
从 sanity_check 导入 check_sanity_config
if __name__ == '__main__':
check_sanity_config()
在 sanity_check.py 中,现在以下函数想要打开 cfg/config.yml (原始文件的摘录):
import yaml
def check_sanity_config():
with open('config.yml', "r", encoding="utf-8") as stream:
config_yml = yaml.safe_load(stream)
if __name__ == '__main__':
check_sanity_config()
当我像上面所示运行管道时,我收到此错误:
PYTHONPATH: D:\a\1\s\cfg\00-config-tools-ext
File "D:\a\1\s\cfg\gen.py", line 53, in <module>
Using config file at: D:\a\1\s\cfg\config.yml
check_sanity_config()
File "D:\a\1\s\cfg\00-config-tools-ext\sanity_check.py", line 132, in check_sanity_config
with open('config.yml', "r", encoding="utf-8") as stream:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'config.yml'
现在对我来说唯一的解决方法是使用 Azure 的绝对路径,如下所示:
def check_sanity_config():
config_path = 'D:\\a\\1\\s\\cfg\\config.yml'
with open(config_path, "r", encoding="utf-8") as stream:
config_yml = yaml.safe_load(stream)
但是我对这个解决方案并不满意,因为它需要更改整个项目中的数百个相对路径,并且本地执行将不再可能。在我的本地 Windows 机器上,一切都工作得很好。这个问题似乎围绕着“打开[文件]”,不知何故Azure无法找到它 你能建议一个更好的方法吗?我已经尝试了许多不同的方法,例如使用 $(Pipeline.Workspace) 的相对路径,但这些方法不起作用。如何使这些相对路径起作用,还是必须重写所有“with open [file]”语句?
谢谢你
您看到的错误是因为
sanity_check.py
正在其所在的同一目录 (cfg/00-config-tools-ext/) 中查找 config.yml
,但 config.yml
文件实际上位于 cfg/
目录。
您可以在
config.yml
中提供 sanity_check.py
文件的完整路径。请参阅以下脚本。
import os
import yaml
def check_sanity_config():
script_dir = os.path.dirname(os.path.abspath(__file__))
config_path = os.path.abspath(os.path.join(script_dir, '..', 'config.yml'))
with open(config_path, "r", encoding="utf-8") as stream:
config_yml = yaml.safe_load(stream)