Команда ожидания Python popen не работает должным образом
У меня есть скрипт powershell, который вызывает API и возвращает 0 или 99 в зависимости от того, был ли выполнен запрос POST. Мой код 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, я вижу, что он возвращает 99 при сбое запроса POST. Так что проблема не в файле powershell, это кажется.
При отладке файла Python это то, что я вижу на консоли: (обратите внимание на порядок операторов печати в коде Python)
^^^^^^^
99
****************
0
Одна вещь, которую я не понимаю, это то, что "99" делает на выходе? Я даже не печатаю результат между "^^^^^" и "*****". Так что, если скрипт powershell возвращает 99, почему он меняется на 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)
req.wait() вернет код завершения программы, которую вы запустили. В этом случае Power Shell возвращает хороший код завершения 0. Он, кажется, просто распечатывает "99", что вы видите в выводе.
Вы можете использовать:
out = subprocess.check_output(...)
print out