Saya telah mencoba menggunakan perpustakaan dll dari CNES dengan python. Pendekatan pertama saya adalah melalui ctypes dan saya melakukan sesuatu seperti:

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

Pemuatan sederhana ini berjalan sangat lancar di windows tetapi saya mengalami masalah di mac/linux. Lebih khusus lagi ketika saya mencoba menjalankan kode di MacOS saya mendapatkan:

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

Dan di Linux (tepatnya adalah gambar buruh pelabuhan linux pada host macos) saya mendapatkan:

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

Sekarang cukup jelas bahwa ada semacam ketidakcocokan di Linux dan Macos untuk dll ini. Pertanyaan saya adalah:

  1. mengapa demikian?
  2. apakah ada cara untuk membuat perpustakaan ini lebih "kompatibel"?

Saya telah melihat-lihat sedikit dan mungkin Cython bisa berguna tetapi saya tidak sepenuhnya yakin. Terima kasih sebelumnya atas bantuannya!

Seseorang menunjukkan ini: Mengimpor dll dengan python di Ubuntu tetapi bahkan meskipun ini bisa menjadi solusi yang valid, saya lebih suka menyelesaikan masalah pada intinya.

1
Paolo Squadrito 10 Juli 2020, 17:42

1 menjawab

Jawaban Terbaik

Seperti yang dijelaskan hoefling, library *.dll hanya untuk Windows. Di situs yang Anda tentukan, sudah ada perpustakaan yang dibuat untuk dan Linux.

enter image description here

Static lib propa64.a pasti akan bekerja di Linux, dan saya kira jika itu untuk platform x86 64-bit, itu juga harus bekerja di MacOS.

0
Olha 11 Juli 2020, 16:43