サーチ…


前書き

このドキュメントでは、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