как получить доступ к классу из dll в python?

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

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

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

>>> 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.

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

РЕДАКТИРОВАТЬ:

@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)


person user1278616    schedule 19.03.2012    source источник
comment
Насколько мне известно, библиотеки DLL не могут содержать классы. Они могут содержать функции, и компиляторы преобразуют имена методов в имена функций, прежде чем помещать их в DLL. Так что это полностью зависит от языка, на котором реализованы библиотеки DLL. (Отказ от ответственности: я не знаком с .NET и платформой Windows.)   -  person Sven Marnach    schedule 19.03.2012
comment
Это может быть неактуально, но довольно часто dll dotnet на самом деле не являются двоично скомпилированными dll, они представляют собой байт-код С# с расширением dll.   -  person aquavitae    schedule 19.03.2012
comment
Спасибо за все отклики! Ссылка, упомянутая @cons0ul, приведет вас на эту веб-страницу ссылка, где кто-то написал шаблон C#, чтобы упростить экспорт управляемого кода в собственные приложения без необходимости регистрации COM. с примером 'class Test { [DllExport (добавить, CallingConvention = CallingConvention.StdCall)] public static int Add (int left, int right) { return left + right; } }'. Но ничего о том, чтобы получить этот тестовый класс в python (или из какой dll). примечание: никогда не использовал C# b4   -  person user1278616    schedule 19.03.2012
comment
@ user1278616: Мой предыдущий комментарий был задуман как запрос дополнительной информации от вас. Возможно, вы ищете документацию по интеграции IronPython с .NET. (Опять же, просто предположение.)   -  person Sven Marnach    schedule 19.03.2012
comment
@SvenMarnach: я отредактировал сообщение, но, возможно, моя проблема достаточно общая (или я достаточно потерян), поэтому нет никакой новой информации, позволяющей вам помочь мне...   -  person user1278616    schedule 20.03.2012
comment
Я взглянул на IronPython и смог заставить его работать с моими файлами dll, но я хочу сделать это на Python, так как я уже много чего делаю на этом языке. Это предложение не имеет смысла. IronPython является реализацией Python. Вы сказали, что я не хочу использовать Visual C++, потому что хочу использовать C++. Очевидно, вы путаете CPython с Python. Если вам нужна интеграция с .NET, вам подойдет IronPython, и я действительно предполагал, что вы его используете.   -  person Sven Marnach    schedule 20.03.2012
comment
.. Мне не удалось импортировать стандартные вещи, такие как numpy, scipy и pyvisa, в ironpython, поэтому я предположил, что это нечто отличное от python. Быстрый поиск в Google показывает, что может быть можно получить подобные вещи в ironpython. Могу ли я иметь произвольные пакеты Python в ironpython?   -  person user1278616    schedule 21.03.2012


Ответы (1)


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

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

person wagnerpeer    schedule 29.06.2012