さて、本日は C#からPythonを実行してみようと思います。先日、国土地理院の標高APIについて書いてみたのですが、これを生かして何かできないかと思い本エントリーを書くに至りました。国土地理院の標高API興味のある方はぜひ以下エントリーを読んでみてください。
C# から Python スクリプトを実行する方法
C#の Process を使って、Pythonのスクリプトを実行し、printした値を受け取ることができます。そして、Pythonの戻り値そのものを取得することはできません。詳細は以下サイトに載っています。
今回実装するもの
以下のような簡単な画面を作りました。処理は以下のような流れです。
- C# で作成した画面で緯度経度を入力し実行(Pythonスクリプトを実行)
- Pythonスクリプト側で緯度経度を受け取り、標高APIで標高値を取得し、それをprint
- C# 側でPythonスクリプトがprintした値(標高)を受け取り、それを標高のテキストボックスに出力
環境
Windows10(64bit)
Python3.6.5
Visual Studio2017
.NET Framework4.7.2
サンプルコード
C#
実行ボタンを押した際の処理です。Pythonに渡す引数を作って、Process()を実行するだけですね。とてもシンプルにできます。
private void ExecuteClick(object sender, EventArgs e) { // Pythonインタープリタのパス var pythonInterpreterPath = @"python.exe"; // Pythonスクリプトのパス var pythonScriptPath = @"module.py"; // Pythonスクリプトに渡す引数 var arguments = new List<string> { pythonScriptPath , LatText.Text, // 緯度 LonText.Text // 経度 }; var process = new Process() { StartInfo = new ProcessStartInfo(pythonInterpreterPath) { UseShellExecute = false, RedirectStandardOutput = true, Arguments = string.Join(" ", arguments), }, }; process.Start(); //python側でprintした内容を取得 var sr = process.StandardOutput; var result = sr.ReadLine(); // 標高を取得 ElevationText.Text = result; process.WaitForExit(); process.Close(); }
Python
C# から受け取った緯度経度を使用して標高を取得し、それをprintします。printした結果がC#側に渡されます。
import sys import requests args = sys.argv lat = args[1] lon = args[2] url = "http://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php" \ "?lon=%s&lat=%s&outtype=%s" %(lon, lat, "JSON") resp = requests.get(url, timeout=10) data = resp.json() print(data["elevation"])
実行
このように入力し、実行を押します。
実行後、Pythonスクリプトで取得された標高が表示されます。
すごく簡単にできました。
Pythonのreturnを受け取れないのが少しもどかしいところですが、C# から Pythonスクリプト を実行するのは全然難しくないことがわかりました。Pytonで画面を作成するのは面倒なので、Pythonで作った処理結果を画面で表示したいという場合はこのような方法をとってもいいかもしれないですね。本日は以上です。