如何从C#应用程序中调用(Iron)Python代码?

时间:2011-08-13 20:46:38

标签: c# ironpython

有没有办法用C#调用Python代码,我假设使用IronPython?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:111)

这个过程很简单,特别是在C#/ .NET 4应用程序中,通过使用dynamic类型改进了对动态语言的支持。但这最终取决于您打算如何在应用程序中使用(Iron)Python代码。您始终可以将ipy.exe作为单独的进程运行并传递源文件,以便执行它们。但您可能希望在C#应用程序中托管它们。这给你留下了很多选择。

  1. 添加对IronPython.dllMicrosoft.Scripting.dll程序集的引用。您通常会在根IronPython安装目录中找到它们。

  2. using IronPython.Hosting;添加到源代码顶部,并使用Python.CreateEngine()创建IronPython脚本引擎的实例。

  3. 您可以从此处获得几个选项,但基本上您可以创建ScriptScopeScriptSource并将其存储为dynamic变量。如果您选择这样做,这允许您执行它或操作C#中的范围。

  4. 选项1:

    使用CreateScope()创建一个空的ScriptScope,直接在C#代码中使用,但可以在Python源代码中使用。您可以将这些视为解释器实例中的全局变量。

    dynamic scope = engine.CreateScope();
    scope.Add = new Func<int, int, int>((x, y) => x + y);
    Console.WriteLine(scope.Add(2, 3)); // prints 5
    

    选项2:

    使用Execute()在字符串中执行任何IronPython代码。您可以使用重载,您可以传入ScriptScope来存储或使用代码中定义的变量。

    var theScript = @"def PrintMessage():
        print 'This is a message!'
    
    PrintMessage()
    ";
    
    // execute the script
    engine.Execute(theScript);
    
    // execute and store variables in scope
    engine.Execute(@"print Add(2, 3)", scope);
    // uses the `Add()` function as defined earlier in the scope
    

    选项3:

    使用ExecuteFile()执行IronPython源文件。您可以使用重载,您可以传入ScriptScope来存储或使用代码中定义的变量。

    // execute the script
    engine.ExecuteFile(@"C:\path\to\script.py");
    
    // execute and store variables in scope
    engine.ExecuteFile(@"C:\path\to\script.py", scope);
    // variables and functions defined in the scrip are added to the scope
    scope.SomeFunction();
    

    选项4:

    使用GetBuiltinModule()ImportModule()扩展方法创建包含所述模块中定义的变量的范围。必须在搜索路径中设置以这种方式导入的模块。

    dynamic builtin = engine.GetBuiltinModule();
    // you can store variables if you want
    dynamic list = builtin.list;
    dynamic itertools = engine.ImportModule("itertools");
    var numbers = new[] { 1, 1, 2, 3, 6, 2, 2 };
    Console.WriteLine(builtin.str(list(itertools.chain(numbers, "foobar"))));
    // prints `[1, 1, 2, 3, 6, 2, 2, 'f', 'o', 'o', 'b', 'a', 'r']`
    
    // to add to the search paths
    var searchPaths = engine.GetSearchPaths();
    searchPaths.Add(@"C:\path\to\modules");
    engine.SetSearchPaths(searchPaths);
    
    // import the module
    dynamic myModule = engine.ImportModule("mymodule");
    

    您可以在.NET项目中托管Python代码。 C#有助于弥合差距更容易处理。结合这里提到的所有选项,您可以做任何你想要的事情。当然,您可以对IronPython.Hosting命名空间中的类进行更多操作,但这应该足以让您入门。

答案 1 :(得分:5)

1)需要安装

Install-Package DynamicLanguageRuntime -Version 1.2.2

2)需要使用以下命令添加“ Iropython.dll”:https://www.webucator.com/how-to/how-add-references-your-visual-studio-project.cfm

3)需要使用

using IronPython.Hosting;
using IronPython.Runtime;
using IronPython;
using Microsoft.Scripting.Hosting;
using Microsoft.Scripting;

3)需要设置var

ScriptEngine engine = Python.CreateEngine();

答案 2 :(得分:2)

要运行一个函数,您不能像Jeff Mercado的响应的选项3中那样调用它(这是一个很棒且非常有用的功能!但是此选项至少在.NET 4.5上不能编译)。您可以使用ScriptScope.GetVariable来获取实际函数,然后可以像C#函数一样调用它。 像这样使用它:

C#代码:

var var1,var2=...
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.ExecuteFile(@"C:\test.py", scope);
dynamic testFunction = scope.GetVariable("test_func");
var result = testFunction(var1,var2);

Python代码:

def test_func(var1,var2):
    ...do something...

花点时间终于弄清楚了,这很简单。可惜没有良好的IronPython文档。希望这会有所帮助:)