17

我有以下问题:我有一个用 python 编写的旧应用程序。此应用程序允许用户指定将执行的小 Python 步骤,Python 步骤基本上是小的 Python 脚本,我称它们为步骤是因为此应用程序的执行涉及其他步骤,例如从命令行执行某些操作。这些 python 步骤作为 python 代码存储在 xml 文件中。

现在我想使用 C# .NET 重写应用程序。是否有最佳实践解决方案来做这样的事情?

我不想将 python 称为外部程序并将实际的 python 步骤(脚本)传递给 python 解释器 - 我想要内置的东西。我刚刚遇到 IronPython 和 .NET python 但我不太确定使用哪一个. 我想为小脚本实现某种调试,这就是为什么调用解释器解决方案是不可接受的。

更重要的是,很多这些脚本已经存在。因此,我必须使用 python 的 C# 实现,它具有与 python 相同的语法以及相同的 python 内置库。这甚至可能吗?

感谢和问候 Xeun

4

3 回答 3

18

IronPython是您想要的。它编译为 .NET 字节码。您可以相当容易地从另一种 .NET 语言调用 python 代码(反之亦然)。我认为 Visual Studio 也支持 IronPython。

于 2014-04-17T09:37:26.507 回答
9

可以使用 IronPython 从 C# 执行 Python 脚本。

    var ipy = Python.CreateRuntime();
    dynamic test = ipy.UseFile("Test.py");
    test.Simple();

也可以看看:

http://putridparrot.com/blog/hosting-ironpython-in-ac-application/

https://blogs.msdn.microsoft.com/charlie/2009/10/25/running-ironpython-scripts-from-ac-4-0-program/

于 2017-10-10T08:39:11.607 回答
4

您可以使用 IronPython 的 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 是免费的,而且非常易于使用。希望这可以帮助 :)

于 2018-12-04T12:01:07.523 回答