从 Azure Pipeline 运行脚本时如何使相对路径正常工作?

问题描述 投票:0回答:1

我的 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]”语句?

谢谢你

azure azure-devops continuous-integration azure-pipelines cicd
1个回答
0
投票

您看到的错误是因为

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)

© www.soinside.com 2019 - 2024. All rights reserved.