当前位置: 首页 > 面试题库 >

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

柴意智
2023-03-14
问题内容

我猜想有没有一种方法可以使用C#从IronPython调用Python代码?如果是这样,怎么办?


问题答案:

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

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

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

  3. 您可以从此处获得几个选择,但是基本上您可以创建一个ScriptScopeScriptSource将其存储dynamic变量。如果您选择执行此操作,则可以执行该操作或从C#操作范围。

选项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。您可以在可以传递a的地方使用重载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的源文件。您可以在可以传递a的地方使用重载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命名空间中的类进行更多操作,但这足以使您入门。



 类似资料:
  • 问题内容: 我有一个用c#创建的dll,在调用时会执行一些数据库操作。我必须将一些参数从Java应用程序传递到dll中的方法。关于如何执行此操作的任何想法。 要么 通过Java应用程序在c#中调用方法的更好的主意吗? 谢谢 编辑:我的Java应用程序是AVAYA平台的标准Dialogue Designer应用程序,并且我已经开发了一个仅在.net SDK上工作的C#应用​​程序。所以我需要将数据从

  • 我在visual studio中创建了一个dll(我没有使用任何win\u API函数)。我想从我生成的android.apk文件中调用这个dlll,但在运行这个文件时,我遇到了这个错误。 "java.lang.无法从加载器加载Testdll1dalvik.system.PathClassLoader[DexPathList[[zip file"/data/app/], nativeLibrary

  • 我需要调用微软图形API在Azure广告中创建用户。 首先,我需要测试从控制台应用程序,然后需要实现在Azure函数。 https://developer.microsoft.com/en-us/graph/graph-explorer

  • 问题内容: 我想从我的C ++程序中调用python脚本文件。 我不确定要分发给的人是否会安装python。 基本上,我正在寻找一个可以使用的具有Apache类似发行许可证的.lib文件。 问题答案: Boost有一个python接口库可以为您提供帮助。 Boost.Python

  • 问题内容: 我目前正在努力从python脚本调用非python程序。 我有一个〜1000个文件,当通过此C ++程序传递时,将生成〜1000个输出。每个输出文件必须具有唯一的名称。 我希望运行的命令具有以下形式: 到目前为止,我已经尝试过: 因此,我有一个必要文件的数组。我的问题-如何遍历数组并为每个条目将其作为参数传递给上述命令(program_name),并为每个文件指定唯一的输出ID? 问题

  • 我有一个工作的Android应用程序。其中我没有一个源代码。我想调试这个应用程序的功能。我可以使用apktool成功地对这个应用程序apk文件进行反向工程-https://code.google.com/p/android-apktool/该工具以smali格式生成类文件。 我的要求是: 能够通过添加调试日志来调试方法 能够通过打印堆栈跟踪调试方法调用 为了实现这一点,我需要注入/插入相当于调试日