#はじめに
唐突に画像と動画を加工してみたくなり、VisualStudio2017でPython3/OpenCVを使ってみました。
普段はC#を使っているので、使い慣れたC#からPythonスクリプトを呼び出せないか試してみました。
#参考資料
下記のサイトを参考に実装しています。
Inter-process communication between C# and Python
#実装方法
言語 | 実装する処理 |
---|---|
Python | 「第1引数の値」 + 「第2引数の値」 を出力する |
C# | 「第1引数の値」と「第2引数の値」を指定して、Pythonスクリプトを呼び出し、結果を出力する |
###1. Python側を実装
AdditionSample.py
import sys
if len(sys.argv) == 3:
firstArgument = int(sys.argv[1])
secondArgument = int(sys.argv[2])
print(firstArgument + secondArgument)
else:
print('ArgumentException...')
###2. C#側を実装
Sample.cs
class Program
{
static void Main(string[] args)
{
//VisualStudioが利用しているインタープリターのパス
var pythonInterpreterPath = @"C:\sample\path\Anaconda3\python.exe";
//「1. Python側を実装」にて保存したスクリプトのパス
var pythonScriptPath = @"C:\sample\path\AdditionSample.py";
var arguments = new List<string>
{
pythonScriptPath ,
"10", //第1引数
"20" //第2引数
};
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();
process.WaitForExit();
process.Close();
Console.WriteLine("Result is ... " + result);
}
}
###実行結果
Result is ... 30
#感想
この方法を使えば、C#とPythonを組み合わせた実装ができそうです。
しかし、この方法だとPython側でprintした内容を受け取ることしかできないようです。
また、指定したPythonスクリプトを実行するだけなので、自由にPython側の処理を呼べるというわけでもありません。
処理内容にもよると思いますが、Python側をWebAPI化して、処理結果をJSON形式で結果を返すのが一番使いやすそうな気もします。