рдкрд╛рдпрдерди рд░реИрдкрд░ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рдкрд╛рдЧрд▓ рди рд╣реЛрдВ

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдмреЗрд░рд╛ рдкрд░ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рд╛, рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рдпреЛрдЧрджрд╛рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛, рдореИрдВрдиреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЧреАрдердм рдкрд░ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реА-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ (рдмрд╛рдж рдореЗрдВ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ) рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереАред рдЙрд╕ рдкрд▓ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, "рдУрд╣, рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдШрдВрдЯреЗ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд▓реЗрдЧрд╛ред" рдореБрдЭрд╕реЗ рдХрд┐рддрдиреА рдЧрд▓рддреА рд╣реБрдИред


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкред рдореИрдВ рдЖрдкрдХреЛ рд╕реА рдореЗрдВ рд╕рдВрдХрд▓рди рдХреЗ рд╕рд╛рде рдкрд╛рдпрдерди рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрд╡-рд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк - рджрд░реНрдж рдФрд░ рдкреАрдПрдХреНрд╕рдбреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред


Cython


рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рддрд╛рдмреЗрдВ рд▓рд┐рдЦреА рдЬрд╛ рдЪреБрдХреА рд╣реИрдВ, рдХрдИ рд▓реЗрдЦ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╣реИрдмреЗ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдпрд╛ рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдЪреАрдЬреЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВ


рд╕рд╛рдЗрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЬрдЧрд░ рдореЗрдВ рд╕реА рдХреЛрдб рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдпрд╛рдд рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред


рдЖрдЗрдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред


from __future__ import print_function def fib(n): """Print the Fibonacci series up to n.""" a, b = 0, 1 while b < n: print(b, end=' ') a, b = b, a + b print() 

рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ fib.pyx рд░реВрдк рдореЗрдВ fib.pyx ред
.pyx Cython рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рд╣реИ, рдЬреЛ C рдХреЛрдб рдХреЗ рд▓рд┐рдП .c рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рд╕реА ред рдбреАред рдбреА ред рдореЗрдВ рднреА рд╣реИ ред рд╕реА ред рдореЗрдВ рд╣реИ ред рдЗрд╕рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ, рд╕рдВрд░рдЪрдирд╛рдУрдВ рдЖрджрд┐ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред


рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрд╝рд╛рдЗрдм рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЛрдб рдХреЛ "рд╕рдВрдХрд▓рд┐рдд" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде setup.py рдмрдирд╛рдПрдБред


 from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("fib.pyx"), ) 

python3 setup.py build_ext --inplace рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж python3 setup.py build_ext --inplace рдЖрдк рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдо рдХреА рдЧрддрд┐ рдХрд╛ рдЖрдирдВрдж рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХрд▓рд┐рдд рднрд╛рд╖рд╛рдПрдБред


 import fib fib.fib(2000) 

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рдордиреЗ рдкрд╛рдпрдерди рдХреЛрдб рд▓рд┐рдЦрд╛ рдФрд░ рдЗрд╕реЗ C рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди C рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдкрд╛рдпрдерди рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдо рдПрдХ рдирдпрд╛ рдлреЛрд▓реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрдВрджрд░ рд╣рдо lib рдлреЛрд▓реНрдбрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо lib/include рдФрд░ lib/src , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, C рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдореБрдЦреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдХ рдФрд░ python_wrap рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдВред


рдЪрд▓рд┐рдП lib/include рдФрд░ struct.h рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ struct.h рдорд╛рдзреНрдпрдо рд╕реЗ C рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред


 typedef struct struct_test{ int a; int b; } struct_test; int minus(struct_test a); 

рдЪрд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рд╢рд╛рдорд┐рд▓ рдХрд╣реЗрдВрдЧреЗред include.h , рдЗрд╕рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдЖрдпрд╛рдд рдХрд░рдирд╛ struct.h


 #include "struct.h" int sum(struct_test param_in_struct); 

рдЕрдм рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдлрд╝рд╛рдЗрд▓ lib/src/test_main.c


 #include "include.h" int sum(struct_test param_in_struct){ return param_in_struct.a+param_in_struct.b; } int minus(struct_test param_in_struct){ return param_in_struct.a-param_in_struct.b; } 

рд╣рд╛рдВ, рдореИрдВ рдЪрд░ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╣реЛрдиреЗ рдХрд╛ рджрд┐рдЦрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рд╕реА-рдкрд╛рд░реНрдЯ рд▓рдЧрднрдЧ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдФрд░ рдХреНрдпрд╛? Makefile, рдпрд╛ CMake рдЬреЛрдбрд╝реЗрдВред lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, CMakeLists.txt рдмрдирд╛рдПрдБред


 set (TARGET "mal") include_directories( include src ) set (SOURCES ./src/test_main.c ) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") add_library(${TARGET} SHARED ${SOURCES}) target_link_libraries(${TARGET} ${LINKLIBS}) add_library(${TARGET}static STATIC ${SOURCES}) target_link_libraries(${TARGET}static ${LINKLIBS}) 

рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ, рд╣рдореЗрдВ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ lib рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдПрдХ рдФрд░ CMakeLists.txt рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░реВрдЯ рдкрд░ред


 cmake_minimum_required(VERSION 2.8.2 FATAL_ERROR) cmake_policy(VERSION 2.8) project( TEST ) set (CMAKE_C_FLAGS "-Werror -Wall -Wextra -Wno-unused-parameter -D_GNU_SOURCE -std=c11 -O3 -g ${CMAKE_C_FLAGS}") add_custom_target( ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/ReplicatePythonSourceTree.cmake ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) include( GNUInstallDirs ) add_subdirectory(lib) 

рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдирд┐рд░реНрдорд╛рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд╛рдпрдерди рдЖрд╡рд░рдг рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдкрд╛рдпрдерди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ include рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдорд╛рд░реНрдЧ рд╕реЗ рдЧреБрдЬрд░рддреЗ include рдФрд░ рд╡рд╣ рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрдХрд▓рд┐рдд рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рддреЛ рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрде рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдФрд░ рднреАред


cmake / ReplicatePythonSourceTree.cmake
 # Note: when executed in the build dir, then CMAKE_CURRENT_SOURCE_DIR is the # build dir. file( COPY setup.py DESTINATION "${CMAKE_ARGV3}" FILES_MATCHING PATTERN "*.py" ) file( COPY lib/src lib/include DESTINATION "${CMAKE_ARGV3}") file(GLOB MY_WRAP "python_wrap/*" ) file( COPY ${MY_WRAP} DESTINATION "${CMAKE_ARGV3}") 

рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЕрд╕реЗрдВрдмрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдкрд╛рдпрдерди рднрд╛рдЧ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред python_wrap рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ python_wrap рджреЛ рдлрд╛рдЗрд▓реЗрдВ main.pxd рдФрд░ main.pyx ред main.pxd рд╣рдореЗрдВ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ *.h рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред


 cdef extern from "include/include.h": ctypedef struct struct_test: int a int b int sum(struct_test param_in_struct); int minus(struct_test param_in_struct); 

cdef extern from "include/include.h" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрд╛рдж ctypedef struct struct_test: рдЖрддрд╛ рд╣реИ ctypedef struct struct_test: рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг рддрд╛рдХрд┐ рдЗрд╕реЗ рдкрд╛рдпрдерди рдХреЛрдб рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЕрдВрдд рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрдиред рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИред


main.pyx рд╣рдо рдкрд╛рдпрдерди рд╕реЗ рд▓реЗрдХрд░ рд╕реА рддрдХ рд╕рдВрдХреНрд░рдордг рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ рд╕реА рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд╛рдпрдерди рдХреЛрдб рд▓реЛрдб рдХрд░реЗрдВред рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


 from main cimport sum, minus def sum_py(int x, int y): return sum({"a":x,"b":y}) def minus_py(int x, int y): return minus({"a":x,"b":y}) 

рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд▓рд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ setup.py рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВред


 from distutils.core import setup from distutils.extension import Extension from Cython.Distutils import build_ext ext_modules = [Extension('main', ['main.pyx'], libraries=['mal'], library_dirs=['lib/'])] setup(name = 'work extension module', cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules) 

рд╕реА рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВрдЧреЗред


 #!/bin/sh rm -rf build; mkdir build && cd build cmake .. && make $@ python3 setup.py build_ext -i 

рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ


 $ sh build.sh $ python3 > import build.main as main > dir(main) [.... 'minus_py', 'sum_py'] > main.minus_py(10,2) 8 > main.sum_py(10,2) 12 

Ctypesgen


рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рднреА рдХреЛ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ .pxd рдлрд╛рдЗрд▓реЗрдВ рд▓рд┐рдЦреЗрдВ рдФрд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рд╕рд╡рд╛рд▓ рд╣реИ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рд╣рдо git clone https://github.com/davidjamesca/ctypesgen.git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА git clone https://github.com/davidjamesca/ctypesgen.git ред рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА build/lib/ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдПрдВред


 python3 ~/ctypesgen/run.py -lmal ../include/*.h -o main_wrap.py 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдХрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред


 $ python3 > import main_wrap as main > dir(main) [... 'struct_test', 'minus', 'sum'] > main.sum(main.struct_struct_test(1,2)) 3 > main.minus(main.struct_struct_test(1,2)) -1 

рдЦреИрд░, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╡рд╛рд▓ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рдиреАрдпрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ) рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд░реАрдбрдореЗ рд╕реНрдЯреЗрдкрдЬреЗрди рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


 $ ctypesgen.py -lneon /usr/local/include/neon/ne_*.h -o neon.py $ python > import neon > dir(neon) [...,'sys', 'time_t', 'union_ne_session_status_info_u', 'wstring_at'] 

рдЕрдВрдд рдореЗрдВ, рдЬреАрдердм рдХрд╛ рд▓рд┐рдВрдХ, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХреИрд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi467615/


All Articles