
рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓, рдкрд╛рдпрдерди 3 рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдХ рдкреБрд░рд╛рдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреВрд░рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓реЗрдЦ рд╣реИрдВ, рдореИрдВрдиреЗ рдЙрд╕ рд╡рд░реНрд╖ рджреЛрдиреЛрдВ рдХреЛ рдЭреЗрд▓рд╛ рдФрд░ рдЕрдм рдЬрдм рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рд╕реА рд╕реЗ рдкрд╛рдпрдерди 3 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреВрдВрдЧрд╛ (рдореИрдВрдиреЗ рдЬреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛)ред рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдХреНрд╖рд╛ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП рдФрд░ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдФрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рднреА рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬреЛ рдореИрдВ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛ред
рд╕рдВрдХреБрд▓
рд╣рдо рд╕реА рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред рдЖрд╡рд╢реНрдпрдХ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ:
- python3
- python3-рджреЗрд╡
- python3-рд╕рдм
- python3 рд╕рднреА-рджреЗрд╡
- libpython3 рд╕рднреА-рджреЗрд╡
рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ
рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рдо рдкрд╛рдЗрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
#include <Python.h>
рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ:
Py_Initialize();
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рд╣реИ:
PyRun_SimpleString("print('Hello!')");
рджреБрднрд╛рд╖рд┐рдпрд╛ рдЙрддрд╛рд░реЗрдВ:
Py_Finalize();
рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг:
#include <Python.h> void main() { // Python Py_Initialize(); // PyRun_SimpleString("print('Hello!')"); // Python Py_Finalize(); }
рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ:
gcc simple.c $(python3-config --includes --ldflags) -o simple && ./simple Hello!
рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
gcc $(python3-config --includes --ldflags) simple.c -o simple && ./simple /tmp/ccUkmq57.o: In function `main': simple.c:(.text+0x5): undefined reference to `Py_Initialize' simple.c:(.text+0x16): undefined reference to `PyRun_SimpleStringFlags' simple.c:(.text+0x1b): undefined reference to `Py_Finalize' collect2: error: ld returned 1 exit status
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ python3-config --includes --ldflags рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬрд╝реЛрдВ рдореЗрдВ рдлреИрд▓рддрд╛ рд╣реИ:
-I/usr/include/python3.6m -I/usr/include/python3.6m -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/lib -lpython3.6m -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions
рдпрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ -Wl рд▓рд┐рдВрдХрд░ рдХрд╛ рдХрдиреЗрдХреНрд╢рди рдСрд░реНрдбрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред рдХреМрди рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдореИрдВ рдЙрддреНрддрд░ рдХреЛ рдкреВрд░рдХ рдХрд░реВрдВрдЧрд╛ред
MooNDeaR рд╕реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг :
рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдЦреЛрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдЕрдкреНрд░рдпреБрдХреНрдд рдкрд╛рддреНрд░реЛрдВ рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдВрдд рдореЗрдВ simple.c рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдЬрдЧрд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рд▓рд┐рдВрдХрд░ Py_Initialize () рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рднреА рдкреНрд░рддреАрдХ рдЗрд╕ рдХреНрд╖рдг (рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ) рджреНрд╡рд╛рд░рд╛ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдкрд╛рдпрдерди рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
simple.c
#include <Python.h> void python() { // Python Py_Initialize(); // // sys PyRun_SimpleString("import sys"); // python PyRun_SimpleString("sys.path.append('./src/python')"); PyRun_SimpleString("import simple"); PyRun_SimpleString("print(simple.get_value(2))"); PyRun_SimpleString("print(simple.get_value(2.0))"); PyRun_SimpleString("print(simple.get_value(\"Hello!\"))"); // Python Py_Finalize(); } void main() { puts("Test simple:"); python(); }
simple.py
рд▓реЗрдХрд┐рди рдпреЗ рд╕рд░рд▓ рдФрд░ рдирд┐рд░реНрдмрд╛рдз рдЪреАрдЬреЗрдВ рд╣реИрдВ, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред
рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЪрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдпрд╣ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
рдЗрд╕рдореЗрдВ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдФрд░ рдлрдВрдХрд╢реЛ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ:
PyObject * python_init() {
рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд░рдирд╛:
void python_clear() {
рдЪрд░ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
char * python_func_get_str(char *val) { char *ret = NULL;
рдЖрдЗрдП рд╣рдо рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВред
pVal = PyObject_CallFunction(pObjct, (char *) "(s)", val);
"(s)" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ get_value (x) рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ 1 char * рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
pVal = PyObject_CallFunction(pObjct, (char *) "(sss)", val1, val2, val3);
рдпрджрд┐ рдЖрдкрдХреЛ рдЗрдВрдЯ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрддреНрд░, рд╕рднреА рд╕рдВрднрд╡ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдкрджрдирд╛рдо рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
pVal = PyObject_CallFunction(pObjct, (char *) "(i)", my_int);
func.py:
( рд╕рдорд╕реНрдпрд╛ рд╣рд▓ )
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдореИрдВ рдЕрднреА рддрдХ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрд╛:
int main() { puts("Test func:"); if (!python_init()) { puts("python_init error"); return -1; } puts("Strings:"); printf("\tString: %s\n", python_func_get_str("Hello from Python!")); puts("Attrs:"); printf("\ta: %d\n", python_func_get_val("a")); printf("\tb: %d\n", python_func_get_val("b")); printf("\tc: %d\n", python_func_get_val("c")); python_clear(); return 0; }
рдЕрдЧрд░ рдореБрдЭреЗ func.py рд╕реЗ b рдпрд╛ c рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ , рддреЛ:
Py_Finalize();
рдореБрдЭреЗ рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рдорд┐рд▓рддрд╛ рд╣реИ ред рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ ред
рд╡рд░реНрдЧ рдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
Pwl рд╕реЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг :
PyObject PyDict_GetItemString (PyObject p, const char * key)
рд╡рд╛рдкрд╕реА рдорд╛рди: рдЙрдзрд╛рд░ рд╕рдВрджрд░реНрднред рдЙрдзрд╛рд░ рд▓рд┐рдП рдЧрдП рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВ PyDict_GetItemString () рдХреЗ рд▓рд┐рдП Py_XDECREF () рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдХ рд╡рд┐рднрд╛рдЬрди рджреЛрд╖ рд╣реЛрддрд╛ рд╣реИ ред
рдХрдХреНрд╖рд╛ рдХрд╛ рдХрд╛рдо
рдЕрднреА рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реИред
рдЗрд╕рдореЗрдВ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдФрд░ рдХреНрд▓рд╛рд╕рд╣реЛрдо рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред
PyObject * python_init() {
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
char * python_class_get_str(char *val) { char *ret = NULL; pVal = PyObject_CallMethod(pInstance, (char *) "get_value", (char *) "(s)", val); if (pVal != NULL) { PyObject* pResultRepr = PyObject_Repr(pVal);
рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдХрд┐ рдЗрдВрдЯ , рдбрдмрд▓ , рдмреВрд▓ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╕рд╛рдордЧреНрд░реА рд▓рд┐рдЦрддреЗ рд╕рдордп рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд┐рдпрд╛)
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рд╕рдВрджрд░реНрдн