15 มิถุนายน 2559

Published มิถุนายน 15, 2559 by with 0 comment

เขียนโมดูลภาษาไพทอน C/C++ ด้วย ctypes

หากต้องการเขียนโมดูลในภาษาไพทอน แต่ต้องการความเร็ว หรือ ต้องการนำโค้ดภาษาซี หรือ C++ มาใช้เป็นโมดูลในภาษาไพทอน คุณสามารถใช้โมดูล ctypes ในการช่วยเขียนโมดูลภาษาไพทอนด้วยภาษาซี ได้ตามตัวอย่างง่าย ๆ ตามนี้


1.สร้างไฟล์ 1.c แล้วเขียนโค้ดลงไป

//1.c
__declspec(dllexport) int sum(int a, int b) {
return (a + b) + b - a;
}

2.สร้างไฟล์ 1.h โดยใส่โค้ดดังนี้
int sum(int, int);
3.เปิด Command Prompt ถ้า Windows เปิด Visual Studio Command Prompt
แล้วใช้คำสั่งไปยังโฟลเดอร์ที่เก็บไฟล์ 1.c กับ 1.h ใน Windows ใช้คำสั่ง
cl /LD 1.c

สำหรับบนลินุกซ์ Linux สามารถใช้ gcc/g++ ในการคอมไพล์ได้โดยใช้คำสั่ง
gcc -Wall -Wextra -O -ansi -pedantic -shared 1.c -o 1.so

จะได้ไฟล์ 1.so ในลินุกซ์ครับ ส่วนใน Windows จะได้ไฟล์ 1.dll
ไฟล์ dll กับ so ต่างกันอย่างไร
ไฟล์ dll คือ DIIs ใช้ในระบบปฏิบัติการ Windows เท่านั้น
ไฟล์ so คือ ไฟล์ shared objects ใช้ในระบบปฏิบัติการตระกูล UNIX
ทั้งคู่ต่างเป็น Dynamic Link Library แต่มีการใช้งานในระบบปฏิบัติการที่แตกต่างกัน

4.เสามารถเรียกใช้ไฟล์ dll กับ so โดยใช้โมดูล ctypes ดังนี้

>>> from ctypes import *
>>> a = cdll.LoadLibrary("1.dll")
>>> a

เราสามารถใส่ค่าลงไปได้

>>> from ctypes import *
>>> a = cdll.LoadLibrary("1.dll")
>>> a.sum(10, 20)
40

ระวังในการคอมไพล์ภาษาซีเพื่อใช้ Python ผู้อ่านต้องคอมไพล์ให้ Bit ตรงกับรุ่นของ Python

อ่านเอกสารการใช้งาน ctypes เพิ่มเติมได้ที่ https://docs.python.org/3/library/ctypes.html

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)