Call Python from .NET

本文关键字:NET from Python Call | 更新日期: 2023-09-27 18:01:37

我有一些用Python编写的代码,这些代码不能转移到。net语言。我需要从我的。net WinForms应用程序中调用这些函数中的一个。

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

有没有更好的方法从。net应用程序调用.py脚本的函数?最好的方法是什么?

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

Call Python from .NET

这可能比启动Python进程要多很多工作,但这里有一个替代解决方案。

你可以将Python嵌入到另一个程序中。API是为C编写的,而来自。net的互操作可能是一个大问题。如果你想用一种更安全的方式来处理原生Python API,你可以看看Boost.Python,它在其宣传较少的特性中,支持嵌入。

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

编辑: AFAIK,所有你必须添加到你的安装过程是部署Python DLL和Boost.Python DLL。

除了COM选项,您还可以使Python脚本实例化xmlrpc server -它是相当透明的,您永远不必在自己的代码中处理"xml"。

然后,在。net端,你只需通过xmlrpc连接到你的python应用程序-如果在c#中没有合适的方法来做到这一点,只需在IronPython中编写客户端函数。

Python文档中的SimpleXMLRPCServer示例就足够了:

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

我认为你需要重新评估Carlos的回答。请参阅Mark Hammond的《Python Programming on Win32》中使用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)

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

我认为你需要Activestate的ActivePython发行版来完成它。

参见这个问题:从。net使用Python COM服务器

它是有效的,但是我不是很喜欢这个解决方案,我想把它改进成一个更好的。

不,我敢说没有更好的解决方案,特别是如果IronPython对你来说是禁忌的话。因此,在等待脚本迁移到。net或直到您发现有人已经在。net上编写了一个库,为您提供类似的功能时,您仍然可以将此作为临时解决方案。

从。py脚本创建一个COM .dll,并在。net代码中使用Interop。看看这里:http://docs.python.org/faq/windows.html

PythonNet应该可以帮助解决这个问题。它使您能够从c#调用python代码。

更简洁的方法是通过Flask REST API公开python脚本,并从。net应用程序中使用它。不要忘记适当地进行身份验证。