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