在C#中使用Python对象

6 投票
3 回答
10345 浏览
提问于 2025-04-15 11:30

有没有简单的方法可以在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来实现。

撰写回答