在AzureDevops Pipeline(Ubuntu 20.04)的subprocess.run()中运行sphin



问题

正如标题所说,我正试图在Azure DevOps Build Pipeline中的Ubuntu 20.04上从subprocess.run()运行sphinx-apidoc

我的问题是,我似乎得到了一个错误,但没有消息,什么都没有真正执行?

我的代码是

call = ['sphinx-apidoc']
try:
res = subprocess.run(call, text=True, check=True, stderr=subprocess.PIPE,            stdout=subprocess.PIPE)
print(res)
print("stdout: ", res.stdout)
print("stderr: ", res.stderr)
except subprocess.CalledProcessError as e:
print("CalledProcessError: " + e.output)

我的输出是

CalledProcessError:

而没有任何输出。

我尝试了什么

我可以使用管道步骤调用sphinx-apidoctask: CmdLine@2例如,我也可以使用上面的subprocess.run()调用python --version,使用

call= ['python'] 
call.append('--version')
  1. 为什么我没有从错误中得到输出
  2. 为什么它不起作用,尽管其他命令(如运行python)也起作用
  3. 为什么我可以毫无问题地从管道步骤执行命令

更新-任务定义

对于测试命令,我只使用以下命令:

- task: CmdLine@2
inputs:
script: |
sphinx-apidoc *putfolder *source

我的python脚本应该运行Subprocess.run()

Python3.9.15

- task: PythonScript@0
inputs:
scriptSource: 'filePath'
scriptPath: '$(System.DefaultWorkingDirectory)/myScript.py'

p.s.我知道只有在没有参数的情况下调用sphinx-apidoc才会导致错误,这只是为了简单起见。它仍然应该给我一个正确的错误消息,这样我就知道子流程运行正常了

好的,所以在尝试了很多不同的事情之后,我想回答自己:

有很多问题。

1.斯芬克斯apidoc模块路径

我提供了一个sphinx-apidoc不喜欢的绝对模块路径。需要通过相对路径

2.正确使用capture_output-option

最后,我删除了stdout=子流程。PIPE,然后只设置capture_output。我还删除了我临时使用的shell=True

3.检查命令字符串

我使用subprocess.list2cmdline(*listOfArgs*)来验证我的命令,我还必须删除不需要的引号/双引号。

因此,这与Azure DevOps或一些错误的环境设置无关,只是我无法在Ubuntu:D下正确地使用python+处理字符串和命令进行开发。但也许这对来说仍然有帮助

最终代码

(并不完美,还会向您显示发送的命令,并向您提供命令的输出)

cmd = ['sphinx-apidoc']
cmd.append('-f')
...          
try:
res = subprocess.run(callList, text=True, capture_output=True, check=True)
print(res)
print(res.stdout)
except subprocess.CalledProcessError as e: 
print("CalledProcessError: " + str(e.output))

相关内容

  • 没有找到相关文章

最新更新