C#からPythonを呼び出すには?ProcessStart・Visual Studio 2019を起動
- システム
エンジニア - C#からPyhtonを呼び出すにはどうすればいいのですか。
- プロジェクト
マネージャー - C#からPythonを呼び出す方法には3通りありますが、今回はProcessStartを使った方法を解説します。
C#からPythonを呼び出すには
C#からPythonを呼び出す方法には3通りあります。pythonnet、IronPython、ProcessStartの3つの方法です。
pythonnetはVisual Studio 2019では古くてエラーが出るので、ここでは扱いません。IronPythonは普通に使われているPythonとは違うので扱いません。
ここではProcessStartを使ってC#からPythonを呼び出すことを行います。
ProcessStartとは
ProcessStartとはC#から外部プロセスを動かすもので、Pythonの環境そのままでPythonプログラムを動かすことが出来るものです。
ProcessStartはPythonのバージョンに左右されずにPythonのプログラムを書いてそのままC#で実行可能なのです。
C#側もC#のコードを書くだけですので、初学者にはわかりやすい方法といえます。
Visual Studio 2019を起動
それではC#からPythonを呼び出すことをします。Visual Studio 2019を起動させ、C#の「コンソールアプリ(.NET Frameworrrk)」を選択して下さい。
Program.csを以下のコードに書き換えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
using System;
using System.Diagnostics;
using System.IO;
namespace ConsoleApp_Python_in_CSharp
{
class Program
{
static void Main(string[] args)
{
//下記のPythonスクリプトへのファイルパスを記述する
string myPythonApp = “test.py”;
int x = 2;
int y = 5;
var myProcess = new Process
{
StartInfo = new ProcessStartInfo(“python.exe”)
{
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = myPythonApp + “ “ + x + “ “ + y
}
};
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardOutput;
string myString = myStreamReader.ReadLine();
myProcess.WaitForExit();
myProcess.Close();
Console.WriteLine(“Value received from script: “ + myString);
}
}
}
|
ここでキモなのは
このソースコードでキモとなるのは次のところです。
1
|
using System.Diagnostics;
|
これがProcessStartでプログラムを走らせる参照設定になります。この1行を加えるだけでC#からPythonスクリプトを呼び出すことが可能になります。
その他で重要な部分は
その他で重要な部分は次の通りです。
1
|
string myPythonApp = “test.py”;
|
これはソースコードにコメントアウトで書いてある通りにPythonスクリプトへのフルパスを通します。ここでは
1
|
“test.py”
|
となっているので上記のソースコードでビルドしたと時に生成されるbinフォルダの中のDebugフォルダに設置しなければなりません。それは生成されるConsoleApp_Python_in_CSharp.exeと同じフォルダにtest.pyがあることを示しているからです。
test.pyの作成
それではVisual Studio 2019をビルドしてDebugフォルダにtest.pyを設置します。test.pyは次の通りです。
1
2
3
4
5
6
7
8
|
import sys
x = int(sys.argv[1])
y = int(sys.argv[2])
print(x + y)
|
デバッグなしで開始
Visual Studio 2019をデバッグなしで開始します。すると、コマンドプロンプトが立ち上がり次のように出力されていれば成功です。
1
2
|
Value received from script: 7
続行するには何かキーを押してください . . .
|
色々とtest.pyで試してみる
C#のソースコードは下記の通りどこも変えないで、test.pyを変えて色々と試してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
using System;
using System.Diagnostics;
using System.IO;
namespace ConsoleApp_Python_in_CSharp
{
class Program
{
static void Main(string[] args)
{
//下記のPythonスクリプトへのファイルパスを記述する
string myPythonApp = “test.py”;
int x = 2;
int y = 5;
var myProcess = new Process
{
StartInfo = new ProcessStartInfo(“python.exe”)
{
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = myPythonApp + “ “ + x + “ “ + y
}
};
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardOutput;
string myString = myStreamReader.ReadLine();
myProcess.WaitForExit();
myProcess.Close();
Console.WriteLine(“Value received from script: “ + myString);
}
}
}
|
test.pyを次のように変えます。
1
2
3
4
5
6
7
8
|
import sys
x = int(sys.argv[1])
y = int(sys.argv[2])
print(x*y)
|
次のように出力されるはずです。
1
2
|
Value received from script: 10
続行するには何かキーを押してください . . .
|
これでC#からPythonが呼び出されていることがハッキリと分かるでしょう。
円の面積を求める
次にtest.pyでnumpyをimportして半径x=2の円の面積を求めてみます。その際、引数にyは必要ないのでC#のコードを次のように書き換えます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
using System;
using System.Diagnostics;
using System.IO;
namespace ConsoleApp_Python_in_CSharp
{
class Program
{
static void Main(string[] args)
{
//下記のPythonスクリプトへのファイルパスを記述する
string myPythonApp = “test.py”;
int x = 2;
//int y = 5;
var myProcess = new Process
{
StartInfo = new ProcessStartInfo(“python.exe”)
{
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = myPythonApp + “ “ + x
}
};
myProcess.Start();
StreamReader myStreamReader = myProcess.StandardOutput;
string myString = myStreamReader.ReadLine();
myProcess.WaitForExit();
myProcess.Close();
Console.WriteLine(“Value received from script: “ + myString);
}
}
}
|
test.pyは次のように書き換えます。
1
2
3
4
5
6
7
8
9
|
import sys
import numpy as np
x = int(sys.argv[1])
#y = int(sys.argv[2])
print(x*x*np.pi)
|
次のように出力されれば成功です。
1
2
|
Value received from script: 12.566370614359172
続行するには何かキーを押してください . . .
|
- システム
エンジニア - ProcessStartを使ったPythonの呼び出し方についてよく分かりました。
- プロジェクト
マネージャー - 今は日常生活ではAIは欠かせません。AIといえばPythonですが、画面操作を伴うような場合、C#で画面周りは作ってPyhtonが呼び出せればとても便利です。今回ご紹介した方法を理解して、今後活用してください。
C#からPythonの呼び出し方を知っていて損はありません
AIが日常生活に深く入り込んでいる今、Pythonはこれから先も大人気のプログラミング言語となるでしょう。しかし、UI周りはC#で作り込んだ方が何かと便利です。
そのためにC#からPythonを呼び出す方法を知っていれば、鬼に金棒です。是非、自分でもっと調べてコードを書きながら実践して下さい。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
Array新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)