используя объекты Python в C # - PullRequest
6 голосов
/ 10 мая 2009

Есть ли простой способ вызова объектов Python из C #, то есть без какого-либо COM-беспорядка?

Ответы [ 4 ]

8 голосов
/ 10 мая 2009

Да, с помощью хостинга IronPython.

6 голосов
/ 10 мая 2009

В текущей выпущенной версии C # нет отличного способа достичь этого без использования какого-либо слоя моста. Вы можете в некоторой степени разместить его в IronPython, но использовать преимущества динамических возможностей IronPython сложно, поскольку C # - язык с очень статической типизацией

Если вы говорите о IronPython, то C # 4.0 сможет взаимодействовать с этим без всяких проблем. C # 4.0 представляет новую функцию calldh dynamic, которая позволяет ему работать с любым языком, работающим на DLR.

dynamic d = GetSomePythonObject();
d.SomeMethod();
5 голосов
/ 10 мая 2009

Я знаю 3 способа:

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 общаются через сокеты. Это можно сделать, если у вас есть код, который вы не можете преобразовать в Iron Python, и вам нужен удаленный доступ к нему. Это требует большей работы, потому что вам нужно маршалировать и демаршировать аргументы и возвращать значения из байтов или строк, но это то, что сделала одна моя команда, когда нам нужно было заставить C # общаться с удаленным процессом Python.

1 голос
/ 10 мая 2009

Вы можете взглянуть на эту запись .

...