Python popen wait 命令未按预期运行

Python popen wait command not behaving as expected

我有一个 PowerShell 脚本,它根据 POST 请求是否通过来调用 API 和 returns 0 或 99。我的 PowerShell 代码:

try
{
    Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType 'application/json' -ErrorAction Stop

    return 0
}
catch
{
    return 99
}

这就是我从 Python 脚本中调用脚本的方式:

req =    subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
                             '-ExecutionPolicy',
                             'Unrestricted',
                             './call.ps1',
                             param1, param2], cwd=os.getcwd())

    print("^^^^^^^")
    result = req.wait() #something is going wrong here
    print("****************")
    print(result)
  
    if result == 0:
        # do something
    else:
        # do something else

这就是问题所在。即使 POST 请求失败,“结果”变量仍然是“0”而不是“99”。当我单独 运行 PowerShell 脚本时,我可以看到它在 POST 请求失败时返回 99。所以问题似乎不在于 PowerShell 文件。

在调试 Python 文件时,这是我在控制台上看到的:(注意 Python 代码中打印语句的顺序)

^^^^^^^
99
****************
0

有一件事我不明白,“99”在输出中做什么?我什至没有打印“^^^^^”和“*****”之间的结果。因此,如果 PowerShell 脚本返回 99,为什么它在“*****”之后变为 0?

req.wait() 将 return 您的程序的退出代码 运行。在这种情况下,power shell return 是一个很好的退出代码 0。它似乎只打印出“99”,这就是您在输出中看到的内容。

您可能想使用:

out = subprocess.check_output(...)
print out

99 是由 PowerShell 创建的输出,因为您使用 return 而不是 exit。因此,脚本打印 99 并以退出代码 0 退出(这是 req.wait() 收到的)。此外,您的 PowerShell 命令行并不是以实际 return 从脚本中获得正确退出代码的方式构建的,因此即使您使用 exit 而不是 return 该过程也只会return成功时输入 0,出错时输入 1。

要使用 PowerShell return 脚本的退出代码,您需要自己 return 退出代码

powershell.exe -Command "&{.\call.ps1; exit $LASTEXITCODE}"

或者使用-File参数调用脚本

powershell.exe -File .\call.ps1

要解决此问题,请将您的 PowerShell 代码更改为:

try {
    Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType 'application/json' -ErrorAction Stop
    exit 0
} catch {
    exit 99
}

和你的 Python 代码:

req = subprocess.Popen([r'C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe',
      '-ExecutionPolicy', 'Unrestricted',
      '-File', './test.ps1',
      param1, param2], cwd=os.getcwd())

print("^^^^^^^")
result = req.wait()
print("****************")
print(result)