如何在C#中从Python脚本调用特定方法?

17

我在想是否有可能从Python脚本中调用C#项目中的特定方法。

我没有代码...但我的想法是:

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)

我该如何通过C#调用这个Python脚本中的某个方法?


2
你看过这个网站吗?https://dev59.com/DGw05IYBdhLWcg3wwEYS - Simon Opelt
我想将参数传递给Python方法并获取返回值...这就是我想做的事情...但是那些都没有帮助到我。 - VanDeath
这回答了你的问题吗?如何从C#应用程序调用(Iron)Python代码? - Jim G.
3个回答

29

你可以托管IronPython,执行脚本并通过创建的范围访问在脚本中定义的函数。

以下示例展示了基本概念以及使用C#中函数的两种方式。

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

6
我找到了一种类似的做法,使用它调用方法更容易。
以下是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的网络上工作,这非常好。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接