Как правильно использовать файл .dll в python на linux и mac - PullRequest
1 голос
/ 10 июля 2020

Я пытался использовать библиотеку dll из CNES в python. Мой первый подход был через ctypes, и я сделал что-то вроде:

from ctypes import *
cdll.LoadLibrary("dll/propa64.dll")

Эта простая загрузка проходит очень гладко на windows, но у меня проблемы с mac / linux. В частности, когда я пытаюсь запустить код на MacOS, я получаю:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-6-74c6935de494> in <module>
----> 1 cdll.LoadLibrary("dll/propa64.dll")

~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in LoadLibrary(self, name)
    440
    441     def LoadLibrary(self, name):
--> 442         return self._dlltype(name)
    443
    444 cdll = LibraryLoader(CDLL)

~/opt/anaconda3/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    362
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:
    366             self._handle = handle

OSError: dlopen(dll/propa64.dll, 6): no suitable image found.  Did find:
    dll/propa64.dll: unknown file type, first eight bytes: 0x4D 0x5A 0x90 0x00 0x03 0x00 0x00 0x00
    /range/code_python/propa/dll/propa64.dll: unknown file type, first eight bytes: 0x4D 0x5A 0x90 0x00 0x03 0x00 0x00 0x00

и Linux (если быть точным, это изображение linux docker на хосте macos), я получаю:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-3-74c6935de494> in <module>
----> 1 cdll.LoadLibrary("dll/propa64.dll")

/opt/conda/lib/python3.7/ctypes/__init__.py in LoadLibrary(self, name)
    440 
    441     def LoadLibrary(self, name):
--> 442         return self._dlltype(name)
    443 
    444 cdll = LibraryLoader(CDLL)

/opt/conda/lib/python3.7/ctypes/__init__.py in __init__(self, name, mode, handle, use_errno, use_last_error)
    362 
    363         if handle is None:
--> 364             self._handle = _dlopen(self._name, mode)
    365         else:
    366             self._handle = handle

OSError: dll/propa64.dll: invalid ELF header

Теперь совершенно ясно, что существует какая-то несовместимость на Linux и Macos для этой dll. Мой вопрос:

  1. почему это?
  2. есть ли способ сделать эту библиотеку более «совместимой»?

Я искал немного и, возможно, Cython может быть полезен, но я не совсем уверен. Заранее благодарим за помощь!

Кто-то указал на это: Импорт dll в python на Ubuntu , но даже при том, что это может быть допустимым обходным путем, я предпочел бы решить проблему в это ядро.

1 Ответ

0 голосов
/ 11 июля 2020

Как объяснил hoefling , библиотеки * .dll предназначены только для Windows. На указанном вами сайте уже созданы библиотеки и Linux.

введите описание изображения здесь

stati c lib propa64.a определенно должен работать на Linux, и я думаю, если он для платформы x86 64-bit, он также должен работать на MacOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...