рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ C рд╕реЗ рдкрд╛рдпрдерди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ Python3 рд╕реЗ C / C ++ рдХреЛ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдо рдкреВрд░реЗ рд╡рд┐рд╖рдп рдХреЛ рдЕрдВрдд рддрдХ рдкреНрд░рдХрдЯ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдБ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рд╕реА
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ, рдЕрдЬрдЧрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
test.c:
#include "test.h" int a = 5; double b = 5.12345; char c = 'X'; int func_ret_int(int val) { printf("get func_ret_int: %d\n", val); return val; } double func_ret_double(double val) { printf("get func_ret_double: %f\n", val); return val; } char * func_ret_str(char *val) { printf("get func_ret_str: %s\n", val); return val; } char func_many_args(int val1, double val2, char val3, short val4) { printf("get func_many_args: int - %d, double - %f, char - %c, short - %d\n", val1, val2, val3, val4); return val3; }
test.h:
#ifndef _TEST_H_ #define _TEST_H_ #ifdef __cplusplus extern "C" { #endif #include <stdio.h> #include <string.h> #include <unistd.h> int func_ret_int(int val); double func_ret_double(double val); char *func_ret_str(char *val); char func_many_args(int val1, double val2, char val3, short val4) #ifdef __cplusplus } #endif #endif /* _TEST_H_ */
рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
gcc -fPIC -shared -o libtest.so test.c
рд╕реНрд░реЛрдд рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд▓рдбрд╝рд╛рдИ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
рд╣рдо рдкрд╛рдпрдерди рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдХреИрд╕реЗ рдмрджрд▓реЗрдВред
main.py:
рд╕рднреА рд╕рдВрднрд╡ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдкрджрдирд╛рдо рдкрд╛рдпрдерди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рд╕реА - рдЯреЗрд╕реНрдЯ рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ред
typedef struct test_st_s test_st_t; struct test_st_s { int val1; double val2; char val3; };
рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп:
test_st_t * func_ret_struct(test_st_t *test_st) { if (test_st) { printf("C get test_st: val1 - %d, val2 - %f, val3 - %c\n", test_st->val1, test_st->val2, test_st->val3); } return test_st; }
рдЕрдЬрдЧрд░:
import sys import struct
рд╕реА ++
рдпрд╣ рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ctypes рдХреЗрд╡рд▓ C рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ C, C ++ рдХреЛрдб рдХреЛ рдмрд╛рдБрдз рджреЗрдЧрд╛ред
C ++ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ C рдмрд╛рдЗрдВрдбрд┐рдВрдЧ:
#include "test.hpp" std::string test::ret_str(std::string val) { std::cout << "get ret_str: " << val << std::endl; return val; } int test::ret_int(int val) { std::cout << "get ret_int: " << val << std::endl; return val; } double test::ret_double(double val) { std::cout << "get ret_double: " << val << std::endl; return val; } /* * C C++ */ // test, . test *test_new() { return new test(); } // test. void test_del(test *test) { delete test; } /* * . */ // ret_str char *test_ret_str(test *test, char *val) { // char * std::string std::string str = test->ret_str(std::string(val)); // std::string char * char *ret = new char[str.length() + 1]; strcpy(ret, str.c_str()); return ret; } // ret_int int test_ret_int(test *test, int val) { return test->ret_int(val); } // ret_double double test_ret_double(test *test, double val) { return test->ret_double(val); } /* * . */ // a int test_get_a(test *test) { return test->a; } // b double test_get_b(test *test) { return test->b; } // c char test_get_c(test *test) { return test->c; }
рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╣реИ, рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рдмрд╛рд╣рд░реА рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред рддрд╛рдХрд┐ ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░ рди рдбрд╛рд▓реЗрдВред рдпрджрд┐ рд╡рд╣ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо ctypes рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
test.hpp:
#include <iostream> #include <string.h> class test { public: int a = 5; double b = 5.12345; char c = 'X'; std::string ret_str(std::string val); int ret_int(int val); double ret_double(double val); }; #ifdef __cplusplus extern "C" { #endif test *test_new(); void test_del(test *test); char *test_ret_str(test *test, char *val); int test_ret_int(test *test, int val); double test_ret_double(test *test, double val); int test_get_a(test *test); double test_get_b(test *test); char test_get_c(test *test); #ifdef __cplusplus } #endif
рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
g ++ -fPIC -sared -o libtestpp.so test.cpp
рдЕрдЬрдЧрд░ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд╣реИред
Ctypes рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ
рдкреЗрд╢реЗрд╡рд░реЛрдВ :
- рдЖрдк рдХрд┐рд╕реА рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╡рд┐рдкрдХреНрд╖ :
- рдкрд╛рдпрдерди рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред
рдХреЛрдб рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдпрд╣рд╛рдБ рдХрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП)
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдзрдиреНрдпрд╡рд╛рдж
рдЙрд╕рдХреА рдорджрдж рдХреЗ рд▓рд┐рдП DollaR84 ред
рдорд┐рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд▓рд┐рдЪ 239 ред
рд╕рдВрджрд░реНрдн