在C#中使用Python对象
有没有简单的方法可以在C#中调用Python对象,也就是不需要搞什么复杂的COM配置?
3 个回答
5
我知道有三种方法:
1) 使用Iron Python,这样你的Python项目就可以和用C#写的项目自由互动。
2) 将你的Python函数暴露给COM。如果你需要使用一些Python库,但不想或者不能转换成Iron Python(比如你只有一个DLL文件),你可以这样做。其实“COM麻烦”并没有那么糟糕,只要你的Python代码和C#代码在同一台机器上运行就行。下面这段代码来自这个教程,可以看到其实并不是特别复杂:
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)
3) 让C#和Python通过套接字(sockets)进行通信。如果你有一些代码无法转换成Iron Python,并且需要远程访问它,就可以这样做。这种方法需要做的工作最多,因为你需要处理参数和返回值,把它们从字节或字符串转换过来,但这是我团队在需要让C#和远程Python进程沟通时采用的方式。
6
在目前发布的C#版本中,没有很好的方法可以做到这一点,除非使用某种桥接层。你可以在一定程度上使用IronPython,但由于C#是一种非常静态类型的语言,所以很难充分利用IronPython的动态特性。
不过,如果你提到的是IronPython,那么C# 4.0将能够与它无缝地互操作。C# 4.0引入了一项新功能,叫做动态(dynamic),这使得它可以与任何在DLR上运行的语言一起工作。
dynamic d = GetSomePythonObject();
d.SomeMethod();
8
是的,可以通过托管IronPython来实现。