20 กันยายน 2557

Published กันยายน 20, 2557 by with 0 comment

การสร้าง Python Extension C/C++ ด้วย Cython

  สวัสดีทุกท่านครับ ในช่วงหลัง ๆ นี้ความนิยมการเขียนโปรแกรมของนักพัฒนาส่วนใหญ่ลดการเขียนโปรแกรมในภาษาระดับสูง เช่น ภาษา C/C++ เพราะการพัฒนาที่ใช้เวลานานและมีความเสี่ยงจากการมี Bug ค่อนข้างมากตามมา นักพัฒนาจึงมาเขียนโปรแกรมในภาษาอื่น ๆ เช่น Python , PHP , C# , JAVA เป็นต้น แทนครับ

  ในภาษา Python มีโมดูลและความสามารถหลากหลาย แต่ในบางครั้ง งานเขียนโปรแกรมบางอย่าง Python อาจจะไม่มีโมดูลรองรับและงานบางอย่างต้องใช้ภาษาอื่นอย่าง C/C++ เข้ามาช่วยด้วย แต่เนื่องจากความสามารถหนึ่งของ Python เป็นภาษากาวที่ดี คือ สามารถเชื่อมต่อการทำงานกับภาษาได้ดีนั้นเองครับ ก่อนอื่นให้ผู้อ่าน ทำการติดตั้ง Cython ก่อนครับ โดยสั่งติดตั้งโดยใช้ pip
$ pip install cython
สำหรับใน Windows ให้ผู้อ่านไปโหลดไฟล์ติดตั้ง Cython มาจาก http://www.lfd.uci.edu/~gohlke/pythonlibs/#cython ครับ

วิธีการสร้าง Python Extension C/C++ ด้วย Cython

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

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

หรือผู้อ่านจะใช้ภาษา C++

//1.c++
#define DLLEXPORT extern "C" __declspec(dllexport)

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
ถ้าผู้อ่านใช้ลินุกซ์ให้แก้ชื่อไฟล์  1.dll เป็น 1.so นะครับ
ระวังในการคอมไพล์ภาษาซีเพื่อใช้ Python ผู้อ่านต้องคอมไพล์ให้ Bit ตรงกับรุ่นของ Python ครับ เช่น ผมใช้
Python 3.4.1 (v3.4.1:c0e311e010fc, May 18 2014, 10:45:13) [MSC v.1600 64 bit (AMD64)] on win32
ผมต้องใช้ MSC v.1600 64 bit นั้นคือ Visual Studio C++ 2010 64 bit เท่านั้นครับ ถ้าผมใช้ Visual Studio C++ 2010 32 bit เมื่อทำมาถึงขั้นตอนที่ 4 จะพบกับปัญหา
เลือกเครื่องมือให้ถูกนะครับ

พบกันใหม่เดือนหน้านะครับ
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

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

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

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