2016-10-14 14 views
0

私はAPIを呼び出し、POSTリクエストが通過した場合に基づいて0または99を返すpowershellスクリプトを使用しました。私のPowerShellのコード:Pythonのpopen waitコマンドが期待通りに動作しない

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

99あなたはreturn代わりのexit使用ためのPowerShellによって作成され出力されます。そのため、スクリプトは99を出力し、終了コード0(これはreq.wait()が受け取ります)で終了します。また、PowerShellのコマンドラインは実際にスクリプトから適切な終了コードを返すように構築されていないため、returnの代わりにexitを使用したとしても、処理が成功した場合は0、エラーの場合は1が返されます。 PowerShellを持っている

あなたは

powershell.exe -Command "&{.\call.ps1; exit $LASTEXITCODE}" 

たり、PowerShellを変更する問題を解決するには-Fileパラメータ

powershell.exe -File .\call.ps1 

を使用してスクリプトを呼び出して終了コードを自分で返すようにどちらかの必要があるスクリプトの終了コードを返しますこれまでのコード:

try { 
    Invoke-RestMethod -uri $url -Method Post -Body $body -ContentType 'application/json' -ErrorAction Stop 
    exit 0 
} catch { 
    exit 99 
} 

とあなたのPython cod e to this:

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

この詳細な説明、Ansgarありがとうございます。今、私のファイルは完全に期待通りに動いています。私は正直言ってこれを私自身で理解することはできませんでした。もう一度、ありがとうございます:) – 90abyss

1

req.wait()は、実行したプログラムの終了コードを返します。この場合、powerシェルは良い終了コード0を返します。出力に表示されている "99"だけを出力しているようです。

あなたは使用することもできます。

out = subprocess.check_output(...) 
print out 
関連する問題