.NET開発者のためのブログメディア
C#からPythonを呼び出すには?ProcessStart・Visual Studio 2019を起動
- SE
- C#からPyhtonを呼び出すにはどうすればいいのですか。
- PM
- 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
続行するには何かキーを押してください . . .
|
- SE
- ProcessStartを使ったPythonの呼び出し方についてよく分かりました。
- PM
- 今は日常生活ではAIは欠かせません。AIといえばPythonですが、画面操作を伴うような場合、C#で画面周りは作ってPyhtonが呼び出せればとても便利です。今回ご紹介した方法を理解して、今後活用してください。
C#からPythonの呼び出し方を知っていて損はありません
AIが日常生活に深く入り込んでいる今、Pythonはこれから先も大人気のプログラミング言語となるでしょう。しかし、UI周りはC#で作り込んだ方が何かと便利です。
そのためにC#からPythonを呼び出す方法を知っていれば、鬼に金棒です。是非、自分でもっと調べてコードを書きながら実践して下さい。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)