【问题标题】:Integration of python in C# Applicationpython在C#应用程序中的集成
【发布时间】:2014-04-17 09:12:39
【问题描述】:

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

现在我想使用 C# .NET 重写应用程序。是否有执行此类操作的最佳实践解决方案?

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

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

感谢和问候 轩

【问题讨论】:

    标签: c# python ironpython python.net


    【解决方案1】:

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

    【讨论】:

    • IronPython 的主要潜在问题是这些脚本是否使用任何 C 扩展 - 如果它们只是纯 Python + stdlib,它们应该没问题。
    • 脚本可以使用 C 扩展。这有什么问题吗?
    • 我目前正试图弄清楚如何在 c# 项目中合并一些 numpy/matplotlib,以简化显示一些数据。 Ironpython 似乎已经落后了,因为这些库似乎不可用。
    • @Bovaz 您可以尝试使用 pythonnet 进行 C-API 扩展和更新的 Python 版本
    【解决方案2】:

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

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

    另见:

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

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

    【讨论】:

    • Uolot 附带了另一个解决方案,顺便说一句,用 p2exe 编译你的 python 并从 .NET stackoverflow.com/questions/1371994/… 调用它
    • 对不起,伙计,我错误地否决了你的答案(真的是鼠标抽搐)并且在 5 分钟内没有发现,我现在无法撤消它
    • 别担心,反正答案是没有高分 :) 谢谢你告诉我!
    • 第二个链接真的很有用。但是,如果我正在构建一个 winform/wpf 桌面应用程序,那么我是否需要在我的所有客户端系统中安装 ironpython?我的意思是,无论谁将使用我的应用程序,他们是否也需要在他们的系统中安装 ironpython?
    【解决方案3】:

    您可以使用 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 是免费的,而且很容易使用。希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2014-02-19
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多