как получить доступ к классу из DLL в Python? - PullRequest
7 голосов
/ 19 марта 2012

У меня есть несколько файлов .dll с классами, предназначенными для управления внешним устройством, подключенным к моему рабочему столу через Ethernet. Я хотел бы импортировать эти классы в python и использовать их функции / переменные-члены и т.д. для управления устройством.

Я рассмотрел несколько вариантов, в том числе:

-типы (которые, похоже, хорошо работают для функций, но не для классов). Здесь "DotNet \ Aerotech.Ensemble.dll" - это моя библиотека dll, а "Сеть" - это класс в этой библиотеке с функцией-членом "Соединиться". Библиотека загружается, но я не могу получить доступ к классу ...

>>> from ctypes import *
>>> lib = cdll.LoadLibrary('DotNet\Aerotech.Ensemble.dll')
>>> lib.Network.Connect()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\ctypes\__init__.py", line 366, in __getattr__
    func = self.__getitem__(name)
  File "C:\Python26\lib\ctypes\__init__.py", line 371, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'Network' not found

-IronPython / Python для .Net, но кажется, что это отдельные языки, и я хочу иметь возможность делать все из одного места (python).

-SWIG. Документация SWIG, похоже, указывает на то, что она может обрабатывать импортируемые классы, но также требует, чтобы код C ++ и / или заголовочные файлы (которых у меня нет) были упакованы для использования в качестве модуля python.

Я новичок и здесь довольно потерян, поэтому любая помощь приветствуется!

EDIT:

@ SvenMarnach: я посмотрел на IronPython и смог заставить его работать с моими dll-файлами, но я хочу сделать это в Python , так как я уже много делаю на этом языке , Я хочу интегрировать эти функции или классы dll или что-то еще в существующие программы на python.

Однако, чтобы заставить IronPython работать, я наткнулся на Python для .NET , который утверждает, что может установить .Net осведомленность к существующим установкам Python ... Это работает (т.е. я могу получить доступ к DLL файлов и управления моим устройством), если я использую его в каталоге, в который я скачал python для файлов .NET, но если я попробую его в другом каталоге (не забывая добавить каталог python.net в sys.path), вы получаю ошибку ImportError: dynamic module does not define init function (initclr)

1 Ответ

1 голос
/ 29 июня 2012

Как я понимаю, вы хотите использовать классы .NET в вашем коде Python. Я также не очень знаком с C # и с тем, как он работает, но если я правильно понимаю, его можно скомпилировать в DLL на Общем Промежуточном Языке. Этот CIL является языком программирования, определяемым инфраструктурой общего языка, изобретенной Microsoft и основой для .NET Framework. Для чтения CIL вы должны использовать Common Language Runtime, который в основном является компилятором Just-In-Time для машиночитаемого байтового кода. Здесь, я думаю, лежит решение вашей проблемы. Чтобы использовать классы, определенные в DLL, которая, как мы надеемся, содержит классы в CIL, вам потребуется CLR, который отображает CIL в байт-код Python! IronPython имеет такой CLR маппер. Однако можно использовать CLR, который работает с чистым Python, часто этот маппер может быть только односторонним (тот, с которым я работал). Если вам нужно использовать функции, которые ожидают объекты CIL / .NET, вам потребуется CLR, который может конвертировать объекты CIL и Python в обоих направлениях.

Надеюсь, это было полезно. Если вам нужна дополнительная информация, я предлагаю ознакомиться с документацией по интеграции .NET для IronPython , как уже было сказано выше.

...