2016-10-14 5 views
0

У меня есть сценарий powershell, который вызывает API и возвращает 0 или 99 на основе запроса POST. Мой код PowerShell:Команда Python popen wait не работает как ожидалось

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

    return 0 
} 
catch 
{ 
    return 99 
} 

Это, как я звоню скрипт из моего питона сценария:

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)

^^^^^^^ 
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) 
+0

Большое спасибо за подробное объяснение, Ансгар. Теперь мои файлы полностью работают, как ожидалось. Я, честно говоря, не смог бы это выяснить сам. Большое вам спасибо еще раз :) – 90abyss

1

req.wait() вернет код выхода программы, с которой вы работаете. В этом случае силовая оболочка возвращает хороший код выхода 0. Кажется, он просто распечатывает «99», что вы видите на выходе.

Вы можете использовать:

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