27 พฤศจิกายน 2558

Published 11/27/2558 by with 0 comment

Embedding Python ในภาษา C/C++ ฉบับเริ่มต้น

สวัสดีผู้อ่านทุกท่านครับ ทุกท่านคงทราบกันดีว่าภาษาไพทอน ถูกเขียนบนภาษาซี เรียกว่า CPython เนื่องจากภาษาไพทอนถูกเขียนบนภาษาซี ทำให้เราสามารถฝังตัว Python (Embedding) เข้าไปยังโปรแกรมที่เขียนในภาษาซีและภาษาซีพลัสพลัสได้ บทความนี้ผมจะพาผู้อ่านไปลองฝังตัวภาษาไพทอนเข้าไปยังโค้ดภาษาซีกันครับ

ก่อนอื่นให้ทำการติดตั้ง GCC compiler ให้เรียบร้อย พร้อมตั้งค่า path ก่อนใช้งาน




สำหรับผู้ใช้ Debian/Ubuntu

หลังทำการติดตั้ง GCC compiler แล้ว ให้ทำการติดตั้ง
สำหรับ Python 2
sudo apt-get install python-dev

สำหรับ Python 3
sudo apt-get install python-dev

แล้วสั่ง
สำหรับ Python 2
python-config  --ldflags

สำหรับ Python 3
python3-config  --ldflags





โค้ดตัวอย่างการฝังตัวภาษาไพทอนลงโปรแกรมภาษาซี


โค้ด pytoc.c

[c]#include <Python.h>

int main(int argc, char *argv[])
{
Py_SetProgramName((wchar_t *)argv[0]); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n"); /* python code PyRun_SimpleString(char* our_python_code_to_run) */
Py_Finalize();
return 0;
}[/c]

อธิบายคำสั่ง

  • Python.h เป็นไฟล์หลักสำหรับดึงไฟล์ภาษาไพทอนเข้ามาฝังตัวในโค้ดภาษาซี

  • เตรียมพร้อม Python environment จากคำสั่ง Py_Initialize()

  • ทำลาย Python environment จากคำสั่ง Py_Finalize()


การคอมไพล์โค้ด pytoc.c


สำหรับ Windows
gcc pytoc.c -I C:\PythonXY\include -LC:/PythonXY/libs -lpythonXY -o pytoc.exe

XY คือ เวชั่นของ CPython ที่ใช้
ตัวอย่างเช่น ใช้ Python 3.4
gcc pytoc.c -I C:\Python34\include -LC:/Python34/libs -lpython34 -o pytoc.exe

ลองโค้ดที่คอมไพล์ออกมาโดยใช้คำสั่ง
pytoc.exe

ผลลัพธ์
Today is Fri Nov 27 06:06:26 2015





สำหรับผู้ใช้งาน Linux
สามารถคอมไพล์ได้ด้วยคำสั่ง
gcc -L/usr/lib/pythonX.Y/config -lpthread -ldl -lutil -lm -lpythonX.Y -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -o pytoc.c

X.Y คือ เวชั่นของ CPython ที่ใช้
ตัวอย่างเช่น ใช้ Python 3.4
gcc -L/usr/lib/python3.4/config -lpthread -ldl -lutil -lm -lpython3.4 -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions -o pytoc.c

ลองโค้ดที่คอมไพล์โดยใช้คำสั่ง
./pytoc

ผลลัพธ์
Today is Fri Nov 27 06:06:26 2015

อ่านเอกสารเพิ่มเติมได้ที่ https://docs.python.org/3/extending/
ติดตามบทความทต่อไปนะครับ
ขอบคุณครับ

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

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

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