1. kaysquare1231

    Posted

    kaysquare1231
Changes in title
+C#からPythonスクリプトを呼び出す
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,86 @@
+#はじめに
+唐突に画像と動画を加工してみたくなり、VisualStudio2017でPython3/OpenCVを使ってみました。
+
+- [VisualStudio2017で、Python3/OpenCVを使って画像を表示する](https://qiita.com/kaysquare1231/items/10234dbb3a5663d095c4)
+- [VisualStudio2017で、Python3/OpenCVを使って動画を加工する](https://qiita.com/kaysquare1231/items/7ec224d44cb34827e18f)
+
+普段はC#を使っているので、使い慣れたC#からPythonスクリプトを呼び出せないか試してみました。
+
+
+#参考資料
+下記のサイトを参考に実装しています。
+[Inter-process communication between C# and Python](https://code.msdn.microsoft.com/windowsdesktop/C-and-Python-interprocess-171378ee)
+
+
+#実装方法
+|言語|実装する処理|
+|:--|:--|
+|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形式で結果を返すのが一番使いやすそうな気もします。