问题
正如标题所说,我正试图在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-apidoc
task: CmdLine@2
例如,我也可以使用上面的subprocess.run()调用python --version
,使用
call= ['python']
call.append('--version')
- 为什么我没有从错误中得到输出
- 为什么它不起作用,尽管其他命令(如运行python)也起作用
- 为什么我可以毫无问题地从管道步骤执行命令
更新-任务定义
对于测试命令,我只使用以下命令:
- 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))