Я пытался использовать библиотеку 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. Мой вопрос:
- почему это?
- есть ли способ сделать эту библиотеку более «совместимой»?
Я искал немного и, возможно, Cython может быть полезен, но я не совсем уверен. Заранее благодарим за помощь!
Кто-то указал на это: Импорт dll в python на Ubuntu , но даже при том, что это может быть допустимым обходным путем, я предпочел бы решить проблему в это ядро.