Anggap saja kita sudah punya definisi class dan propertinya (atribut dan method) yang diprogram dalam C++. Bagaimana caranya menggunakan class berikut propertinya tersebut dalam kode program Python? Berikan contoh kode program dan hasil eksekusinya!
Apa yang dimaksud dalam pertanyaan adalah shared library. Library yang sebelumnya dibangun dengan bahasa pemrograman C++, akan digunakan pada program atau library, pada bahasa pemrograman Python.
Ada beberapa cara, yaitu:
cara dasar: dengan menggunakan built-in packagectypes pada Python.
cara lain dan mungkin ebih mudah: dengan menggunakan package cpppy, atau pustaka Boost.Python.
Catatan: Saya menggunakan sistem operasi Ubuntu yang berjalan pada WSL di MS Windows, dengan Python 3.10. Untuk MS Windows, akan sedikit berbeda. _____________
Bagian I: C++
Misalkan kita sudah mempunyai kode C++ yang berisi definisi class Siswa berikut ini.
Nomor Induk Siswa: 2022.01.001 Nama Siswa: Siswadiningrat Ningratdisiswa _____________
Bagian II: Ekspos C++
Package ctypes pada Python hanya mengenali C, bukan C++. Oleh karena itu, kita tambahkan kode program yang "mengekspos" C++ menjadi C dan dapat "dibaca" oleh bahasa pemrograman lain, dengan sintaks: extern "C" { [isi shared library] }
Pada file siswa.cpp di atas, kita tambahkan: extern "C" { Siswa* Siswa_new() { return new Siswa(); } void Siswa_setNomorInduk(Siswa* siswa, const char* nomorInduk) { siswa->setNomorInduk(nomorInduk); } void Siswa_setNama(Siswa* siswa, const char* nama) { siswa->setNama(nama); } const char* Siswa_getNomorInduk(Siswa* siswa) { return siswa->getNomorInduk(); } const char* Siswa_getNama(Siswa* siswa) { return siswa->getNama(); } } (Bisa juga disimpan dalam file lain, namun cara kompilasi akan berbeda.)
Kemudian, kita compile menjadi shared library, dengan perintah:
Untuk menggunakan (load) shared library dalam libsiswa.so, pada bagian awal kode program Python, kita import package ctypes. Dari package ctypes, kita gunakan module cdll. Untuk memuat shared library digunakan class ctypes.CDLL, atau dengan method ctypes.cdll.LoadLibrary.
Untuk lebih jelasnya, silahkan amati kode program Python berikut ini.
Jawaban dan Penjelasan:
Apa yang dimaksud dalam pertanyaan adalah shared library. Library yang sebelumnya dibangun dengan bahasa pemrograman C++, akan digunakan pada program atau library, pada bahasa pemrograman Python.
Ada beberapa cara, yaitu:
Catatan:
Saya menggunakan sistem operasi Ubuntu yang berjalan pada WSL di MS Windows, dengan Python 3.10. Untuk MS Windows, akan sedikit berbeda.
_____________
Bagian I: C++
Misalkan kita sudah mempunyai kode C++ yang berisi definisi class Siswa berikut ini.
// siswa.cpp
// oleh: hy
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
class Siswa {
private:
const char* nomorInduk;
const char* nama;
// ... dan atribut lainnya
public:
Siswa();
void setNomorInduk(const char* nomorInduk);
void setNama(const char* nama);
const char* getNomorInduk();
const char* getNama();
// ... dan method lainnya
};
Siswa::Siswa() {
this->nomorInduk = (char*)"";
this->nama = (char*)"";
}
void Siswa::setNomorInduk(const char* nomorInduk) {
this->nomorInduk = (char*)nomorInduk;
}
void Siswa::setNama(const char* nama) {
this->nama = (char*)nama;
}
const char* Siswa::getNomorInduk() {
return this->nomorInduk;
}
const char* Siswa::getNama() {
return this->nama;
}
int main() {
Siswa s;
s.setNomorInduk("2022.01.001");
s.setNama("Siswadiningrat Ningratdisiswa");
std::cout << "Nomor Induk Siswa: " << s.getNomorInduk() << std::endl;
std::cout << "Nama Siswa: " << s.getNama() << std::endl;
return 0;
}
Hasil eksekusi:
Nomor Induk Siswa: 2022.01.001
Nama Siswa: Siswadiningrat Ningratdisiswa
_____________
Bagian II: Ekspos C++
Package ctypes pada Python hanya mengenali C, bukan C++. Oleh karena itu, kita tambahkan kode program yang "mengekspos" C++ menjadi C dan dapat "dibaca" oleh bahasa pemrograman lain, dengan sintaks:
extern "C" {
[isi shared library]
}
Pada file siswa.cpp di atas, kita tambahkan:
extern "C" {
Siswa* Siswa_new() {
return new Siswa();
}
void Siswa_setNomorInduk(Siswa* siswa, const char* nomorInduk) {
siswa->setNomorInduk(nomorInduk);
}
void Siswa_setNama(Siswa* siswa, const char* nama) {
siswa->setNama(nama);
}
const char* Siswa_getNomorInduk(Siswa* siswa) {
return siswa->getNomorInduk();
}
const char* Siswa_getNama(Siswa* siswa) {
return siswa->getNama();
}
}
(Bisa juga disimpan dalam file lain, namun cara kompilasi akan berbeda.)
Kemudian, kita compile menjadi shared library, dengan perintah:
$ g++ -c -fPIC siswa.cpp -o siswa.o
(Jika sukses, akan terbentuk file siswa.o.)
$ g++ -shared -Wl,-soname,libsiswa.so -o libsiswa.so siswa.o
(Jika sukses, akan terbentuk file libsiswa.so.)
_____________
Bagian III: Python
Untuk menggunakan (load) shared library dalam libsiswa.so, pada bagian awal kode program Python, kita import package ctypes. Dari package ctypes, kita gunakan module cdll. Untuk memuat shared library digunakan class ctypes.CDLL, atau dengan method ctypes.cdll.LoadLibrary.
Untuk lebih jelasnya, silahkan amati kode program Python berikut ini.
# siswa.py
# oleh: hy
from ctypes import *
# Memuat shared library
lib = cdll.LoadLibrary('../cpp-wsl/libsiswa.so')
class Siswa(object):
# Konstruktor
def __init__(self) -> None:
lib.Siswa_new.argtypes = [c_void_p]
lib.Siswa_new.restype = c_void_p
lib.Siswa_setNomorInduk.argtypes = [c_void_p, c_char_p]
lib.Siswa_setNomorInduk.restype = c_void_p
lib.Siswa_setNama.argtypes = [c_void_p, c_char_p]
lib.Siswa_setNama.restype = c_void_p
lib.Siswa_getNomorInduk.argtypes = [c_void_p]
lib.Siswa_getNomorInduk.restype = c_char_p
lib.Siswa_getNama.argtypes = [c_void_p]
lib.Siswa_getNama.restype = c_char_p
self.obj = lib.Siswa_new(None)
# Method
def set_nomor_induk(self, nomor_induk):
lib.Siswa_setNomorInduk(self.obj, nomor_induk)
def set_nama(self, nama):
lib.Siswa_setNama(self.obj, nama)
def get_nomor_induk(self):
return (lib.Siswa_getNomorInduk(self.obj)).decode()
def get_nama(self):
return (lib.Siswa_getNama(self.obj)).decode()
### Program Utama ###
# Instansiasi objek siswa
siswa = Siswa()
# Set atribut
siswa.set_nomor_induk(b"2022.01.001")
siswa.set_nama(b"Siswadiningrat Ningratdisiswa")
# Output
print(f'Nomor Induk Siswa: {siswa.get_nomor_induk()}')
print(f'Nama Siswa: {siswa.get_nama().upper()}')
Hasil eksekusi:
Nomor Induk Siswa: 2022.01.001
Nama Siswa: SISWADININGRAT NINGRATDISISWA
_____________
Bagian IV: Penutup
Untuk membahas shared-library secara lengkap, saya pikir tidak akan cukup untuk dimuat pada jawaban ini.