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

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

这个过程很简单,特别是在C#/。NET 4应用程序中,dynamic语言的支持已经通过dynamictypes的使用得到了改进。 但是这一切都最终取决于你打算如何在应用程序中使用(Iron)Python代码。 您可以始终运行ipy.exe作为一个单独的进程,并传入源文件,以便它们可以被执行。 但是你可能想把它们放在你的C#应用​​程序中。 这给你留下了很多select。

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

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

  3. 你有几个select从这里,但基本上你会创build一个ScriptScopeScriptSource并将其存储为一个dynamicvariables。 这允许您执行它,或者如果您select这样做,则可以从C#中操作范围。

选项1:

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

 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()在string中执行任何IronPython代码。 您可以在ScriptScope传递的地方使用重载来存储或使用代码中定义的variables。

 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传递的地方使用重载来存储或使用代码中定义的variables。

 // 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()扩展方法创build包含在所述模块中定义的variables的作用域。 以这种方式导入的模块必须在searchpath中设置。

 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项目中做很多托pipePython代码。 C#有助于弥合这个差距更容易处理。 结合这里提到的所有选项,你可以做任何你想做的事情。 当然,你可以用IronPython.Hosting命名空间中的类来做更多的事情,但是这应该足以让你开始。