Случайно се сетих, че ще ми е полезно да мога да интегрирам python код в едно свое проектче на С. След извесно ровене из нета видях начин как може да го направя. Ето го и него:
Първо трябва да инклуднете Python.h във сорса си(това става с #include <python3.0/Python.h> за python3.0 например). Това разбира се ще иска малко настройки при компилация. След доста ровене из нета стигнах до извода, че:
g++/gcc alabala.c -o alabala -I/usr/local/include/python3.0 -pthread
-lm -ldl -lutil -lpython3.0
при мен върши работа (имам някаква бегла идея защо). Вероятно на друг компютър пътят ще е различен, но това би следвало да се очаква. Eто малко примерен код на нещо:
#include <python3.0/Python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString( "print('Hello World :D')" );
Py_Finalize();
return 0;
}
#include <python3.0/Python.h>
int main()
{
Py_Initialize();
FILE *fp = fopen ("test.py", "r+");
PyRun_SimpleFile (fp, "test.py");
Py_Finalize();
return 0;
}
Ето и едно полезно линкче
И още едно линкче
P.S: Посочения горе начин за компилиране работи дори и при условие, че няма динамична библиотека(<path>/lib/libpython3.0.so, където <path> е мястото, където е инсталирана библиотеката). Ако има динамична библиотека работи и посочения от Славомир Къслев начин:
gcc test.c -o test -I/usr/local/include/python3.0 -lpython3.0
който очевидно е по-хубав, но изисква да има динамична библиотека на компютъра. Ако библиотеката не е в някое от стандартните места (/usr/lib, /usr/local/lib) може да се наложи експлицитно да се посочи къде е тя. Това става с добавяне на -L<път> към опциите на компилатора (-l показва коя библиотека да търси като първо се търси динамична по подразбиране и ако не съществува такава се търси статична). Опцията -I показва къде да търси неща от include-а освен във стандартните места.
Динамичните библиотеки отсъстват от някой компютри, защото при компилация на питон от сорс(както аз бях направил) по подразбиране те не се създават. Може да се каже по време на конфигурацията да се създаде shared library(динамична библиотека). Това става с добавяне на --enable-shared към опциите на ./configure извикването. Тя е такава(динамичната), че не е необходимо да се посочват още опции на компилатора за да работи той добре, докато тези неща са необходими на статичната библиотека, за да може тя да функционира правилно.
Съществена разлика при едното и при другото компилиране - на код embed-ваш python - (възможно е и при наличие на динамична библиотека да се каже на компилатора да не я ползва), е размера на получения изпълним файл. При използване на статична библиотека ми се получи файл 3.7 МБ, а при използване на динамична - 7 КБ, което е доста съществено.
Ако някой има още корекции към написаното да каже и ще ги добавя :)
Успех с използването на питон в С код или обратното :)