Saya memiliki tugas untuk "membungkus" perpustakaan ac menjadi kelas python. Dokumen sangat tidak jelas tentang masalah ini. Tampaknya mereka mengharapkan hanya pengguna python tingkat lanjut yang akan mengimplementasikan ctypes. Saya seorang pemula dalam python dan butuh bantuan.
Beberapa bantuan langkah demi langkah akan sangat bagus.
Jadi saya memiliki perpustakaan c saya. Apa yang saya lakukan? File apa yang saya taruh di mana? Bagaimana cara mengimpor perpustakaan? Saya membaca bahwa mungkin ada cara untuk "bungkus otomatis" ke Python?
(Ngomong-ngomong saya melakukan tutorial ctypes di python.net dan itu tidak berhasil. Artinya saya berpikir mereka berasumsi bahwa saya harus dapat mengisi langkah-langkah selanjutnya.
Sebenarnya ini adalah kesalahan yang saya dapatkan dengan kode mereka:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Saya benar-benar dapat menggunakan bantuan langkah demi langkah untuk ini! Terima kasih ~
sumber
>>>
in importtest.py? Ketika orang memposting kode yang ada>>>
di setiap baris, itu menandakan bahwa itu sedang dijalankan di shell interaktif. Untuk menjalankannya dari file, hapus>>>
(yaitu 3> tanda dan spasi) di mana pun ia muncul.>>>
s. Itu dicetak oleh shell interaktif dan harus ditinggalkan dari file sumber Anda.>>>
di file .py! ADUH! Belum pernah melihat itu sebelumnya!Jawaban:
Berikut tutorial ctypes cepat dan kotor.
Pertama, tulis perpustakaan C Anda. Berikut contoh sederhana Hello world:
testlib.c
Sekarang kompilasi sebagai perpustakaan bersama ( perbaikan mac ditemukan di sini ):
Kemudian, tulis pembungkus menggunakan ctypes:
testlibwrapper.py
Sekarang jalankan:
Dan Anda akan melihat hasilnya
Jika Anda sudah memiliki perpustakaan dalam pikiran, Anda dapat melewati bagian non-python dari tutorial. Pastikan ctypes dapat menemukan pustaka dengan meletakkannya di
/usr/lib
atau direktori standar lainnya. Jika Anda melakukan ini, Anda tidak perlu menentukan lokasi lengkap saat menulis pembungkusnya. Jika Anda memilih untuk tidak melakukan ini, Anda harus memberikan jalur lengkap perpustakaan saat memanggilctypes.CDLL()
.Ini bukan tempat untuk tutorial yang lebih komprehensif, tetapi jika Anda meminta bantuan dengan masalah khusus di situs ini, saya yakin komunitas akan membantu Anda.
PS: Saya berasumsi Anda menggunakan Linux karena Anda pernah menggunakan
ctypes.CDLL('libc.so.6')
. Jika Anda menggunakan OS lain, banyak hal mungkin berubah sedikit (atau cukup banyak).sumber
Jawaban oleh Chinmay Kanchi sangat bagus tetapi saya ingin contoh fungsi yang meneruskan dan mengembalikan variabel / array ke kode C ++. Saya pikir saya akan memasukkannya di sini jika itu berguna bagi orang lain.
Meneruskan dan mengembalikan integer
Kode C ++ untuk suatu fungsi yang mengambil integer dan menambahkan satu ke nilai yang dikembalikan,
Disimpan sebagai berkas
test.cpp
, perhatikan diperlukan extern "C" (ini dapat dihapus untuk kode C). Ini dikompilasi menggunakan g ++, dengan argumen yang mirip dengan jawaban Chinmay Kanchi,Kode Python menggunakan
load_library
darinumpy.ctypeslib
asumsi jalur ke pustaka bersama di direktori yang sama dengan skrip Python,Ini mencetak 6 seperti yang diharapkan.
Melewati dan mencetak larik
Anda juga bisa melewatkan array sebagai berikut, untuk kode C untuk mencetak elemen array,
yang dikompilasi seperti sebelumnya dan diimpor dengan cara yang sama. Kode tambahan Python untuk menggunakan fungsi ini adalah,
di mana kita menentukan array, argumen pertama ke
print_array
, sebagai pointer ke array Numpy dari aligned, c_contiguous 64 bit float dan argumen kedua sebagai integer yang memberi tahu kode C jumlah elemen dalam array Numpy. Ini kemudian dicetak dengan kode C sebagai berikut,sumber
import numpy as np
. Jika tidak, ia tidak dapat menemukannp.float64
dan barang-barang lainnya.Pertama:
>>>
Kode yang Anda lihat dalam contoh python adalah cara untuk menunjukkan bahwa itu adalah kode Python. Ini digunakan untuk memisahkan kode Python dari keluaran. Seperti ini:Di sini kita melihat bahwa baris yang dimulai dengan
>>>
adalah kode Python, dan 9 adalah hasilnya. Ini persis seperti yang terlihat jika Anda memulai penerjemah Python, itulah mengapa dilakukan seperti itu.Anda tidak pernah memasukkan
>>>
bagian tersebut ke dalam.py
file.Itu menangani kesalahan sintaks Anda.
Kedua, ctypes hanyalah salah satu dari beberapa cara membungkus pustaka Python. Cara lain adalah SWIG , yang akan melihat pustaka Python Anda dan menghasilkan modul ekstensi Python C yang mengekspos C API. Cara lain adalah dengan menggunakan Cython .
Semuanya memiliki kelebihan dan kekurangan.
SWIG hanya akan mengekspos C API Anda ke Python. Itu berarti Anda tidak mendapatkan objek atau apa pun, Anda harus membuat file Python terpisah melakukan itu. Bagaimanapun juga umum untuk memiliki modul yang disebut say "wowza" dan modul SWIG yang disebut "_wowza" yang merupakan pembungkus di sekitar C API. Ini adalah cara yang bagus dan mudah untuk melakukan sesuatu.
Cython menghasilkan file Ekstensi-C. Keuntungannya adalah semua kode Python yang Anda tulis dibuat menjadi C, jadi objek yang Anda tulis juga dalam C, yang dapat menjadi peningkatan performa. Tapi Anda harus belajar bagaimana itu berinteraksi dengan C jadi itu sedikit pekerjaan ekstra untuk mempelajari bagaimana menggunakannya.
ctypes memiliki keuntungan bahwa tidak ada kode-C untuk dikompilasi, jadi sangat bagus digunakan untuk membungkus pustaka standar yang ditulis oleh orang lain, dan sudah ada dalam versi biner untuk Windows dan OS X.
sumber