Python Language
PythonをC#から呼び出す
サーチ…
前書き
このドキュメントでは、C#とPythonスクリプト間のプロセス間通信の実装例を示します。
備考
上記の例では、NuGetマネージャを介してインストールできるMongoDB.Bsonライブラリを使用してデータがシリアライズされています。
それ以外の場合は、任意のJSON直列化ライブラリを使用できます。
以下に、プロセス間通信の実装手順を示します。
入力引数はJSON文字列にシリアル化され、一時的なテキストファイルに保存されます:
BsonDocument argsBson = BsonDocument.Parse("{ 'x' : '1', 'y' : '2' }"); string argsFile = string.Format("{0}\\{1}.txt", Path.GetDirectoryName(pyScriptPath), Guid.NewGuid());
Pythonインタプリタpython.exeは、一時テキストファイルからJSON文字列を読み込み、入力引数を取り消すPythonスクリプトを実行します。
filename = sys.argv[ 1 ] with open( filename ) as data_file: input_args = json.loads( data_file.read() ) x, y = [ float(input_args.get( key )) for key in [ 'x', 'y' ] ]
Pythonスクリプトが実行され、出力辞書がJSON文字列にシリアル化され、コマンドウィンドウに出力されます。
print json.dumps( { 'sum' : x + y , 'subtract' : x - y } )
C#アプリケーションの出力JSON文字列を読み込む:
using (StreamReader myStreamReader = process.StandardOutput) { outputString = myStreamReader.ReadLine(); process.WaitForExit(); }
私は、Excelスプレッドシートから直接Pythonスクリプトを呼び出すことができる私のプロジェクトの1つで、C#とPythonスクリプト間のプロセス間通信を使用しています。
このプロジェクトではExcelバインディングをC# - Excelバインディングに使用しています。
ソースコードはGitHub リポジトリに保存されています 。
以下は、プロジェクトの概要を説明し、4つの簡単な手順を開始するのに役立つWikiページへのリンクです 。
私はあなたがその例とプロジェクトが役に立つことを願っています。
C#アプリケーションによって呼び出されるPythonスクリプト
import sys
import json
# load input arguments from the text file
filename = sys.argv[ 1 ]
with open( filename ) as data_file:
input_args = json.loads( data_file.read() )
# cast strings to floats
x, y = [ float(input_args.get( key )) for key in [ 'x', 'y' ] ]
print json.dumps( { 'sum' : x + y , 'subtract' : x - y } )
Pythonスクリプトを呼び出すC#コード
using MongoDB.Bson;
using System;
using System.Diagnostics;
using System.IO;
namespace python_csharp
{
class Program
{
static void Main(string[] args)
{
// full path to .py file
string pyScriptPath = "...../sum.py";
// convert input arguments to JSON string
BsonDocument argsBson = BsonDocument.Parse("{ 'x' : '1', 'y' : '2' }");
bool saveInputFile = false;
string argsFile = string.Format("{0}\\{1}.txt", Path.GetDirectoryName(pyScriptPath), Guid.NewGuid());
string outputString = null;
// create new process start info
ProcessStartInfo prcStartInfo = new ProcessStartInfo
{
// full path of the Python interpreter 'python.exe'
FileName = "python.exe", // string.Format(@"""{0}""", "python.exe"),
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = false
};
try
{
// write input arguments to .txt file
using (StreamWriter sw = new StreamWriter(argsFile))
{
sw.WriteLine(argsBson);
prcStartInfo.Arguments = string.Format("{0} {1}", string.Format(@"""{0}""", pyScriptPath), string.Format(@"""{0}""", argsFile));
}
// start process
using (Process process = Process.Start(prcStartInfo))
{
// read standard output JSON string
using (StreamReader myStreamReader = process.StandardOutput)
{
outputString = myStreamReader.ReadLine();
process.WaitForExit();
}
}
}
finally
{
// delete/save temporary .txt file
if (!saveInputFile)
{
File.Delete(argsFile);
}
}
Console.WriteLine(outputString);
}
}
}
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow