C#

【C#】PythonコードをProcessクラスで呼び出して結果を取得

C#からPythonのコードをパス指定で呼び出して、その出力結果を受け取る方法を検証しました。

ちなみにIronPythonというライブラリを使う方法もあるようですが、今回はProcessクラスを使います。

今回使うpythonコード

2つのシンプルなpythonコードを用意します。

標準出力用のstd-out.py

通常の出力結果を表示するためのコード

# 標準出力
print("Hello, Call Python")

標準エラー出力用のstd-err.py

エラー出力を表示するためのコード

※trycatchで例外を検知しても、print()で出力したらC#では標準出力として取得されます。エラーかどうかを判別するために、標準出力と標準エラー出力を使い分けるようにしましょう。

import sys

# 標準エラー(stderr)へ出力
sys.stderr.write('error occured')

※下記の設定を行わないと、ビルドしたフォルダにpythonコードがコピーされないので忘れずに行います。

  • ビルドアクション:コンテンツ
  • 出力ディレクトリにコピー:新しい場合はコピーする

Processクラスを使って実装

using System.Diagnostics;

using (Process process = new Process())
{
    process.StartInfo = new ProcessStartInfo("python")
    {
        // std-out.py か std-err.pyを指定
        Arguments = "std-out.py",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
    };
    process.Start();

    string output = process.StandardOutput.ReadToEnd();
    string err = process.StandardError.ReadToEnd();
    process.WaitForExit();

    Console.WriteLine($"standard output : {output}");
    Console.WriteLine($"standard error : {err}");
}

ProcessStartInfoの引数に実行するファイルのパス(~/python.exe)を渡します。環境変数に設定しているため、pythonを指定しています。

Argumentsに実行したいpythonコードのパスを指定します。今回はプロジェクトのルートディレクトリに置いているので、ファイル名だけ指定しています。

RedirectStandardOutputはtrueに設定します。pythonの標準出力をC#で取得できるようにするためです。

RedirectStandardErrorはtrueに設定します。pythonの標準エラー出力をC#で取得できるようにするためです。

実行結果

Argumentsにstd-out.pyを渡した結果

print()の結果が、標準出力として受け取れていることが確認できます。

Argumentsにstd-err.pyを渡した結果

sys.stderr.write()の結果が、標準エラー出力として受け取れていることが確認できます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です