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.
除了COM选项之外,您还可以使Python脚本实例化xmlrpc服务器-它非常透明,并且您不必在自己的代码中处理“ xml”。
然后,在.net端,您只需通过xmlrpc连接到python应用程序-如果在C#中没有合适的方法可以执行此操作,只需在IronPython中编写一个客户端函数即可。
Python文档上的SimpleXMLRPCServer示例足以满足以下要求:
http://docs.python.org/library/simplexmlrpcserver.html
我认为您需要重新评估卡洛斯的答案。请参阅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发行版才能做到这一点。
它有效,但我不太喜欢这个解决方案,我想将其改进为更好的解决方案。
不,据我所知,没有更好的解决方案,特别是如果 IronPython 不适合您的话。因此,在等待脚本迁移到 .NET 时,或者直到您发现有人已经在 .NET 上编写了一个为您提供类似功能的库之前,您仍然可以将此作为临时解决方法。