やりたかったこと
Windowsサーバ上で実行させるpythonの処理をAPI経由で呼び出したい
※PythonじゃなくてもなんかしらのEXEでも同じようなことはできるような仕組みにはしておきたい。
やったこと
C#のWEBAPIをIIS上に配置して、それ経由でBATを実行させようとした。
※BATはpythonの処理を引数指定で呼び出す程度のもの
BATにしたのは引数などの調整をする際にAPIのほうを修正するのがめんどくさそうだったから。
呼び出しとしては以下
//プロセス起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start("BATのフルパス", id);
p.WaitForExit();
どうにも起動しない。
APIを呼び出しても起動しない。
以下の順で解決していった。
1. BAT内でxxx.pyを呼び出していたが、どうもpyがPythonと関連づけられていなかった。
Pythonと関連づけられていなかったので、python xxx.py のように記載したが、Pathも設定されていなかった。
→Pythonについてはフルパスで設定。
※ここまでは手動でBATを実行してもうまくいかないのでWEBAPIとかは直接関係ない単なるショボミスな話
2.Pythonをフルパスにしたことで上手くいくかと思ったが、処理結果が想定通りにならない。
手動起動ではうまくいくのでWEBAPI経由だとうまくいかなかった。
Process.Start()で呼び出しているが、起動されていなさそう。
結論としては
WEBAPI経由だとIISユーザとして起動されることになるのだが、それに対する権限を付与してなかった。
→BAT格納フォルダやログ出力フォルダに対してeveryoneのフルコントロール権限を付与。
※正確に権限を付与するのであれば「IIS_IUSRS」にすべきなんだろうけど、とりあえずeveryoneで実施。
これで動作した。
結論
気が付けばどうってことないが、思いつかないと結構ハマった。