web-dev-qa-db-ja.com

Python C#のスクリプトから特定のメソッドを呼び出すにはどうすればよいですか?

C#プロジェクトでPythonスクリプトから特定のメソッドを呼び出す可能性があるかどうか疑問に思っています。

私はコードを持っていません...しかし私の考えは:

Pythonコード:

def SetHostInfos(Host,IP,Password):
   Work to do...

def CalcAdd(Numb1,Numb2):
   Work to do...

C#コード:

SetHostInfos("test","0.0.0.0","PWD")
result = CalcAdd(12,13)

このPythonスクリプトからC#経由でメソッドの1つを呼び出すにはどうすればよいですか?

16
VanDeath

IronPythonをホストし、スクリプトを実行し、作成されたスコープを介してスクリプト内で定義された関数にアクセスできます。

次のサンプルは、C#の関数を使用する基本的な概念と2つの方法を示しています。

var pySrc =
@"def CalcAdd(Numb1, Numb2):
    return Numb1 + Numb2";

// Host python and execute script
var engine = IronPython.Hosting.Python.CreateEngine();
var scope = engine.CreateScope();
engine.Execute(pySrc, scope);

// get function and dynamically invoke
var calcAdd = scope.GetVariable("CalcAdd");
var result = calcAdd(34, 8); // returns 42 (Int32)

// get function with a strongly typed signature
var calcAddTyped = scope.GetVariable<Func<decimal, decimal, decimal>>("CalcAdd");
var resultTyped = calcAddTyped(5, 7); // returns 12m
25
Simon Opelt

私はそれを行うための同様の方法を見つけました、メソッドの呼び出しはそれではるかに簡単です。

C#コードは次のようになります。

IDictionary<string, object> options = new Dictionary<string, object>();
options["Arguments"] = new [] {"C:\Program Files (x86)\IronPython 2.7\Lib", "bar"};

var ipy = Python.CreateRuntime(options);
dynamic Python_File = ipy.UseFile("test.py");

Python_File.MethodCall("test");

したがって、基本的には、pythonファイルで定義するライブラリパスを使用して辞書を送信します。

したがって、PYthonスクリプトは次のようになります。

#!/usr/bin/python

import sys
path = sys.argv[0]  #1 argument given is a string for the path
sys.path.append(path)
import httplib
import urllib
import string

def MethodCall(OutputString):
    print Outputstring

そのため、メソッド呼び出しはC#からはるかに簡単になり、渡される引数は同じままです。また、このコードを使用すると、Pythonファイル用のカスタムライブラリフォルダーを取得できます。これは、さまざまなPCが多数あるネットワークで作業している場合に非常に便利です。

6
VanDeath

pythonプログラムにコマンドラインで引数をとらせ、C#コードからコマンドラインアプリとして呼び出すことができます。

それが進むべき道であるなら、たくさんのリソースがあります:

C#からPythonスクリプトを実行するにはどうすればよいですか?http://blogs.msdn.com/b/charlie/archive/2009/10/ 25/hosting-ironpython-in-ac-4-0-program.aspx

2