web-dev-qa-db-ja.com

呼び出しPython c#(.NET)の関数)

私のメインフォームがVisual Studio 2015でC#で記述されており、そこからさまざまなクラスがPython(normal Python not Iron Python)で記述されています)。 Python関数をC#コードから呼び出しますか?

私はこれについて複数のトピックがあることを知っていますが、それらのほとんどは古すぎて、いくつかの解決策は難しすぎるか、C++のような中間言語を使用することを伴います。

役に立つと思ったが、正確に検索していた答えが得られなかったリンクを次に示します。

簡単な方法はありますか、それとも回避策が必要ですか?そして、私が回避策を必要とするならば、最も簡単なものは何ですか?

10
Morganis

コマンドラインからすべてを呼び出すことができます

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "python whatever";
process.StartInfo = startInfo;
process.Start();

あるいは、Python.exeを呼び出して、pyファイルを引数として渡すだけです。

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "Python.exe";
startInfo.Arguments = "yourfile.py";
process.StartInfo = startInfo;
process.Start();
5
Yar

これを行うには、 IronPython を使用することをお勧めします。 IronPythonを使用してPythonコードにアクセスするための基本を説明する別の回答があります: Pythonから特定のメソッドを呼び出す方法= C#のスクリプト?

IronPythonを選択しない場合は、前述のように、コマンドラインから関数を実行し、必要に応じて引数を渡すこともできますが、複雑な場合は、スパゲッティになる可能性があります。以下は、モジュールでpython関数をコマンドラインから直接実行する基本的な例です。

python -c 'import foo; print foo.hello()'

したがって、C#で上記を実行するには:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "python.exe";
startInfo.Arguments = "-c import foo; print foo.hello()";
process.StartInfo = startInfo;
process.Start();

戻り値を取得しようとしている場合は、この場合、データをコンソールに出力し、C#からの出力を必要に応じてシリアル化する必要があることに注意してください。これをフィルタリングするか、その関数からの出力を抑制するオプションがない限り、関数が独自にコンソールに何かを出力する場合、これは潜在的に問題になる可能性があります。

5