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)
我有一个 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)