从.NET调用Python

Tom*_*Tom 16 .net c# python python.net

我有一些用Python编写的代码,不能转换为.NET语言.我需要从.NET WinForms应用程序中调用其中一个函数.

现在,我通过将Python脚本作为单独的进程启动并将参数作为命令行参数传递给它来实现.它有效,但我不喜欢这个解决方案.我想将它改进为更好的一个.

有没有更好的方法.py从.NET应用程序调用脚本的功能?最好的方法是什么?

注意:IronPython不是此Python脚本的选项

And*_*ron 10

这可能比启动Python进程要多得多,但这是另一种解决方案.

您可以将Python嵌入到另一个程序中.API用于C和.NET的Interop可能是一个主要的痛苦.如果您有一种更安全的方式来处理本机Python API,您可以查看一下Boost.Python,在其较少广告的功能中,它支持嵌入.

使用这些工具,您可以编写一个C++托管DLL,用于Boost.Python加载Python解释器并执行任何Python脚本.因此,您可以直接在托管过程中执行任何Python代码,从而无需使用外部进程和任何形式的IPC.

编辑:AFAIK,您必须添加到安装过程中的是部署Python DLL和Boost.PythonDLL.


jsb*_*eno 5

除了COM选项之外,您还可以使Python脚本实例化xmlrpc服务器-它非常透明,并且您不必在自己的代码中处理“ xml”。

然后,在.net端,您只需通过xmlrpc连接到python应用程序-如果在C#中没有合适的方法可以执行此操作,只需在IronPython中编写一个客户端函数即可。

Python文档上的SimpleXMLRPCServer示例足以满足以下要求:

http://docs.python.org/library/simplexmlrpcserver.html


P H*_*ans 5

我认为您需要重新评估卡洛斯的答案。请参阅Mark Hammond的书《 Win32上的Python编程》中的使用Python实现COM对象一节。

您应该能够创建一个COM对象,然后使.Net与之交互。

从这本书中,下面将用一个方法创建一个COM服务器。

# SimpleCOMServer.py - A sample COM server - almost as small as they come!
# 
# We expose a single method in a Python COM object.
class PythonUtilities:
    _public_methods_ = [ 'SplitString' ]
    _reg_progid_ = "PythonDemos.Utilities"
    # NEVER copy the following ID 
    # Use "print pythoncom.CreateGuid()" to make a new one.
    _reg_clsid_ = "{41E24E95-D45A-11D2-852C-204C4F4F5020}"

    def SplitString(self, val, item=None):
        import string
        if item != None: item = str(item)
        return string.split(str(val), item)

# Add code so that when this script is run by
# Python.exe, it self-registers.
if __name__=='__main__':
    print "Registering COM server..."
    import win32com.server.register
    win32com.server.register.UseCommandLine(PythonUtilities)
Run Code Online (Sandbox Code Playgroud)

这本书接着说:“您可以通过将代码作为普通的Python脚本执行来实现。最简单的方法是在PythonWin中打开源文件,并使用“文件”菜单中的“运行”命令。”

我认为您需要Activestate的ActivePython发行版才能做到这一点。

查看此问题从.NET消耗Python COM Server


Dar*_*rov 3

它有效,但我不太喜欢这个解决方案,我想将其改进为更好的解决方案。

不,据我所知,没有更好的解决方案,特别是如果 IronPython 不适合您的话。因此,在等待脚本迁移到 .NET 时,或者直到您发现有人已经在 .NET 上编写了一个为您提供类似功能的库之前,您仍然可以将此作为临时解决方法。

  • @Darin Dimitrov,我建议您查看Python.NET(Python for .NET),也许您可​​以重新考虑您的答案。 (2认同)