Apa cara termudah untuk menggunakan DLL
file dari dalam Python
?
Secara khusus, bagaimana ini bisa dilakukan tanpa menulis C++
kode pembungkus tambahan untuk mengekspos fungsionalitas Python
?
Python
Fungsi asli sangat disukai daripada menggunakan perpustakaan pihak ketiga.
Jawaban:
Untuk kemudahan penggunaan, ctypes adalah cara yang harus dilakukan.
Contoh ctypes berikut ini dari kode aktual yang saya tulis (dengan Python 2.5). Sejauh ini, ini adalah cara termudah yang saya temukan untuk melakukan apa yang Anda minta.
The
ctypes
hal memiliki semua jenis C-tipe data (int
,char
,short
,void*
, dan sebagainya) dan dapat lulus dengan nilai atau referensi. Itu juga dapat mengembalikan tipe data tertentu meskipun contoh saya tidak melakukan itu (API HLL mengembalikan nilai dengan memodifikasi variabel yang dikirimkan oleh referensi).Dalam hal contoh spesifik yang ditunjukkan di atas, EHLLAPI IBM adalah antarmuka yang cukup konsisten.
Semua panggilan melewati empat void pointer (EHLLAPI mengirimkan kembali kode melalui parameter keempat, sebuah penunjuk ke
int
jadi, sementara saya tentukanint
sebagai tipe pengembalian, saya dapat dengan aman mengabaikannya) sesuai dokumentasi IBM di sini . Dengan kata lain, varian C dari fungsi tersebut adalah:Ini membuat
ctypes
fungsi tunggal yang sederhana dapat melakukan apa saja yang disediakan oleh perpustakaan EHLLAPI, tetapi kemungkinan perpustakaan lain akan membutuhkanctypes
fungsi terpisah yang diatur per fungsi perpustakaan.Nilai kembali dari
WINFUNCTYPE
adalah prototipe fungsi tetapi Anda masih harus mengatur informasi parameter lebih banyak (lebih dan di atas jenis). Setiap tuple dalamhllApiParams
memiliki "arah" parameter (1 = input, 2 = output dan sebagainya), nama parameter dan nilai default - lihat dokumenctypes
untuk detailSetelah Anda memiliki prototipe dan informasi parameter, Anda dapat membuat Python "callable"
hllApi
untuk memanggil fungsi tersebut. Anda cukup membuat variabel yang diperlukan (p1
melaluip4
dalam kasus saya) dan memanggil fungsi dengan mereka.sumber
hllApiParams
dilakukan? Apa gunanya tupel itu? Sulit untuk mencocokkan beberapa hal dalam contoh ini dengan dokumentasi.Halaman ini memiliki contoh fungsi panggilan yang sangat sederhana dari file DLL.
Mengutip detail di sini untuk kelengkapan:
sumber
ctypes dapat digunakan untuk mengakses dll, inilah tutorialnya:
http://docs.python.org/library/ctypes.html#module-ctypes
sumber
Mungkin dengan
Dispatch
:Di mana zkemkeeper adalah file DLL terdaftar di sistem ... Setelah itu, Anda dapat mengakses fungsi hanya dengan memanggil mereka:
sumber
Membangun DLL dan menautkannya di bawah Python menggunakan ctypes
Saya menyajikan contoh yang sepenuhnya berhasil tentang bagaimana membangun
shared library
dan menggunakannya di bawahPython
dengan caractypes
. Saya mempertimbangkanWindows
kasus ini dan menanganinyaDLLs
. Dibutuhkan dua langkah:Pustaka bersama
Yang
shared library
saya anggap sebagai berikut dan terdapat dalamtestDLL.cpp
file tersebut. Satu-satunya fungsitestDLL
hanya menerimaint
dan mencetaknya.Membangun DLL dari baris perintah
Untuk membangun
DLL
denganVisual Studio
dari jalankan baris perintahuntuk mengatur jalur sertakan dan kemudian jalankan
untuk membangun DLL.
Membangun
DLL
dari IDEAtau,
DLL
dapat dibangun menggunakanVisual Studio
sebagai berikut:Menghubungkan DLL di bawah Python
Di bawah Python, lakukan hal berikut
sumber
ctypes akan menjadi hal yang termudah untuk digunakan tetapi (salah) menggunakannya membuat Python mengalami crash. Jika Anda mencoba melakukan sesuatu dengan cepat, dan Anda berhati-hati, itu bagus.
Saya akan mendorong Anda untuk memeriksa Boost Python . Ya, itu mengharuskan Anda menulis beberapa kode C ++ dan memiliki kompiler C ++, tetapi Anda sebenarnya tidak perlu belajar C ++ untuk menggunakannya, dan Anda bisa mendapatkan kompiler C ++ gratis (seperti dalam bir) dari Microsoft .
sumber
Jika DLL adalah tipe perpustakaan COM, maka Anda dapat menggunakan pythonnet.
Kemudian dalam kode python Anda, coba yang berikut ini
kemudian instantiate objek sesuai kelas di DLL, dan akses metode di dalamnya.
sumber