GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

C#からPythonスクリプトを実行する方法 ~標高APIを使用して緯度経度から標高を取得する~

さて、本日は C#からPythonを実行してみようと思います。先日、国土地理院の標高APIについて書いてみたのですが、これを生かして何かできないかと思い本エントリーを書くに至りました。国土地理院の標高API興味のある方はぜひ以下エントリーを読んでみてください。

www.gis-py.com

C# から Python スクリプトを実行する方法

C#の Process を使って、Pythonのスクリプトを実行し、printした値を受け取ることができます。そして、Pythonの戻り値そのものを取得することはできません。詳細は以下サイトに載っています。

code.msdn.microsoft.com

今回実装するもの

以下のような簡単な画面を作りました。処理は以下のような流れです。

  • C# で作成した画面で緯度経度を入力し実行(Pythonスクリプトを実行)
  • Pythonスクリプト側で緯度経度を受け取り、標高APIで標高値を取得し、それをprint
  • C# 側でPythonスクリプトがprintした値(標高)を受け取り、それを標高のテキストボックスに出力

f:id:sanvarie:20190714231700p:plain

環境

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"])

実行

このように入力し、実行を押します。
f:id:sanvarie:20190714232909p:plain

実行後、Pythonスクリプトで取得された標高が表示されます。
f:id:sanvarie:20190714232932p:plain

すごく簡単にできました。

Pythonのreturnを受け取れないのが少しもどかしいところですが、C# から Pythonスクリプト を実行するのは全然難しくないことがわかりました。Pytonで画面を作成するのは面倒なので、Pythonで作った処理結果を画面で表示したいという場合はこのような方法をとってもいいかもしれないですね。本日は以上です。