Python popen wait命令不按预期运行

时间:2016-10-14 19:54:41

标签: python powershell popen

我有一个powershell脚本,它调用API并根据POST请求的结果返回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请求失败,“result”变量仍然是“0”而不是“99”。当我单独运行powershell脚本时,我可以看到它在POST请求失败时返回99。所以问题不在于PowerShell文件。

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

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

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

我真的迷失在这里。请帮忙。

2 个答案:

答案 0 :(得分:2)

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

要让PowerShell返回脚本的退出代码,您需要自己返回退出代码

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)

答案 1 :(得分:1)

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

您可能想要使用:

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