我猜想有没有一种方法可以使用C#从IronPython调用Python代码?如果是这样,怎么办?
该过程非常简单,尤其是在C#/。NET 4应用程序中,该应用程序通过使用该dynamic类型改进了对动态语言的支持。但这最终取决于您打算如何在应用程序中使用(Iron)Python代码。您始终可以ipy.exe作为一个单独的进程运行,并传入您的源文件,以便可以执行它们。但是您可能想将它们 托管 在C#应用程序中。这给您留下了很多选择。
dynamic
ipy.exe
添加对IronPython.dll和Microsoft.Scripting.dll程序集的引用。通常,您都会在IronPython的根安装目录中找到它们。
IronPython.dll
Microsoft.Scripting.dll
添加using IronPython.Hosting;到源代码的顶部,并使用来创建IronPython脚本引擎的实例Python.CreateEngine()。
using IronPython.Hosting;
Python.CreateEngine()
您可以从此处获得几个选择,但是基本上您可以创建一个ScriptScope或ScriptSource将其存储为dynamic变量。如果您选择执行此操作,则可以执行该操作或从C#操作范围。
ScriptScope
ScriptSource
使用CreateScope()创建一个空的ScriptScope直接在C#代码的使用,但可使用在Python源。您可以将它们视为解释器实例中的全局变量。
CreateScope()
dynamic scope = engine.CreateScope(); scope.Add = new Func<int, int, int>((x, y) => x + y); Console.WriteLine(scope.Add(2, 3)); // prints 5
使用Execute()一个字符串来执行任意代码的IronPython。您可以在可以传递a的地方使用重载ScriptScope来存储或使用代码中定义的变量。
Execute()
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
使用ExecuteFile()以执行IronPython的源文件。您可以在可以传递a的地方使用重载ScriptScope来存储或使用代码中定义的变量。
ExecuteFile()
// 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();
使用GetBuiltinModule()或ImportModule()扩展方法来创建包含在所述模块中定义的变量的范围。必须在搜索路径中设置以此方式导入的模块。
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命名空间中的类进行更多操作,但这足以使您入门。
IronPython.Hosting