为什么即使命令成功,subprocess.run 也会创建 return 代码 1?

Why does subprocess.run create return code 1 even if the command was successful?

在 python 中,我正在尝试检查 windows 机器上是否安装了 chocolatey。我使用 subprocess.run 来实现它,但是,即使安装了 chocolatey,return 代码也是 1。

这是我的代码:

import subprocess

result = subprocess.run(['choco'], capture_output=True, text=True)
print(result.returncode)

添加选项不会改变其结果。如果我测试像 dir 这样的 windows 命令,一切都会按预期工作。我的错误在哪里?

已编辑:

正如一些评论所指出的,我所说的 选项 并不清楚我的意思,实际上我尝试了与之前建议的类似的事情。然而,我被两件事误导了

  1. 我认为 成功 的调用的想法总是 return 0 作为代码。 Shine J 给出了很好的解释。
  2. 事实证明,我试图提供选项 内联。相反,我不得不将其作为第二个参数提供。从 Popen 的文档(下面称为)中,这对我来说变得很清楚。 Chocolatey 也 returns 0 作为 return 代码,如果这样调用:
import subprocess
result = subprocess.run(['choco','-v'], capture_output=True)

print(result.returncode)

但是,我相信 Shine J 说的最好检查文件是否存在是正确的。因此,我会接受这个作为正确答案。谢谢!

这完全取决于您的程序使用不同参数返回的值。

例如,当我运行我的电脑上安装了以下软件(git已安装):

result = subprocess.run(['git'], capture_output=True)

result.returncode 是 1

如果我 运行 git 参数 --version 是这样的:

result = subprocess.run(['git','--version'], capture_output=True)

result.returncode 是 0

要真正检查程序是否存在(在 Windows 上),您可以这样做:

try:
    result = subprocess.run(['choco'], capture_output=True)
    print(result)
except FileNotFoundError:
    print("Program not installed")

看看这个 official documentation on Subprocess

你运行choco without any arguments, meaning it didn't get a command to perform. It's up to choco whether that's regarded as an error; I suspect it is, much like if you passed it an unknown command. You may want to pass it a command that should succeed, such as choco help.