我有一个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。
我真的迷失在这里。请帮忙。
答案 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