我有一些用Python语言编写的代码,这些代码不能转换为.NET语言。我需要从我的.NET WinForms应用程序中调用其中一个函数。
现在,我将Python脚本作为单独的进程启动,并将参数作为命令行参数传递给它。它是有效的,但我并不是真的喜欢这个解决方案。我想把它改进成更好的。
有没有更好的方法从.NET应用程序调用.py
脚本的函数?做这件事最好的方法是什么?
注意:IronPython不是此Python脚本的选项
发布于 2011-07-08 21:18:18
这可能比启动Python进程要多得多,但这里有一个替代解决方案。
你可以通过embed Python进入另一个程序。.NET的应用编程接口是针对C的,而互操作可能会是一个主要的难题。如果您希望以一种更安全的方式来处理原生Python API,那么可以研究一下Boost.Python
,它具有support for embedding,这是其宣传较少的特性之一。
使用这些工具,您可以编写使用Boost.Python
加载C++解释器和执行任何Python脚本的Python。因此,您可以直接在宿主进程中执行任何Python代码,从而消除了对外部进程和任何形式的IPC的使用。
编辑:AFAIK,你需要在安装过程中添加的就是Python DLL和Boost.Python
DLL的部署。
发布于 2011-07-08 21:13:51
除了COM选项之外,您还可以让Python脚本实例化一个xmlrpc服务器-它非常透明,而且您永远不需要在自己的代码中处理"xml“。
然后,在xmlrpc端,您只需通过.net连接到您的python应用程序-如果在C#中没有合适的方法,只需用IronPython编写一个客户端函数即可。
Python文档中的SimpleXMLRPCServer示例就足够了:
发布于 2012-05-23 19:03:16
我认为你需要重新评估卡洛斯的答案。请参阅Mark Hammond的《Win32上的Python Programming》一书中的使用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中打开源文件,然后使用文件菜单中的Run命令。“
我认为你需要Activestate的ActivePython发行版才能做到这一点。
https://stackoverflow.com/questions/6624503
复制相似问题