如何从C#应用程序调用(Iron)Python代码?
有没有办法从C#中使用IronPython调用Python代码? 如果是这样,怎么样?
这个过程很简单,特别是在C#/。NET 4应用程序中,dynamic语言的支持已经通过dynamic
types的使用得到了改进。 但是这一切都最终取决于你打算如何在应用程序中使用(Iron)Python代码。 您可以始终运行ipy.exe
作为一个单独的进程,并传入源文件,以便它们可以被执行。 但是你可能想把它们放在你的C#应用程序中。 这给你留下了很多select。
-
添加对
IronPython.dll
和Microsoft.Scripting.dll
程序集的引用。 你通常会在你的根IronPython安装目录中find它们。 -
添加
using IronPython.Hosting;
到源代码的顶部,并使用Python.CreateEngine()
创build一个IronPython脚本引擎的实例。 -
你有几个select从这里,但基本上你会创build一个
ScriptScope
或ScriptSource
并将其存储为一个dynamic
variables。 这允许您执行它,或者如果您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
命名空间中的类来做更多的事情,但是这应该足以让你开始。