ููุฏ ูุฑุฃุช ู
ุคุฎุฑูุง ู
ูุงููุง ุนู ูุงุจุฑู ุญูู ุฃุฏุงุฉ ู
ููุฏุฉ ููุบุงูุฉ ุ ูุจู
ุง ุฃููู ููุช ุฃุจุญุซ ุนู ููุน ู
ู ุงูู
ุดุฑูุน ููุชุฑุฉ ุทูููุฉ ูุจุฏุก ุงูู
ุณุงูู
ุฉ ุ ููุฏ ูุฑุฑุช ุฃู ุฃุฑู ู
ุง ูู ุนูู ุฌูุซุจ ูููู ูู
ูููู ุงูู
ุณุงุนุฏุฉ. ูุงูุช ููุงู ู
ุดููุฉ ูุงุญุฏุฉ ุญูู ุฅูุดุงุก ู
ุฌู
ูุน (ุณุฃุณุชุฎุฏู
ุงูู
ุฌู
ุน ูุงุญููุง) ููู
ูุชุจุฉ C. ูู ุชูู ุงููุญุธุฉ ุงุนุชูุฏุช ุ "ุฃูู ุ ุดูุก ู
ุซูุฑ ููุงูุชู
ุงู
ุ ุฃูุง ู
ุชุฃูุฏ ู
ู ุฃู ุงูุฃู
ุฑ ูู ูุณุชุบุฑู ุฃูุซุฑ ู
ู ุณุงุนุฉ." ูู
ููุช ู
ุฎุทุฆุง.
ูู ูุฐู ุงูู
ูุงูุฉ ุ ูุฑุฑุช ุนุฏู
ุฅุธูุงุฑ ุทุฑููุฉ ูุงุญุฏุฉ ูุญู ู
ุดููุฉ ู
ู
ุงุซูุฉ ุ ูููู ุนุฏุฉ ุฎูุงุฑุงุช ู
ุฎุชููุฉ. ุณุฃุนุฑุถ ูู ุฎูุงุฑุงุช ูุฅูุดุงุก ูุญุฏุงุช ูู Python ู
ุน ุชุฑุฌู
ุฉ ูู C ุ ุจุงุณุชุฎุฏุงู
ู
ูุชุจุฉ ุตุบูุฑุฉ ู
ูุชูุจุฉ ุฐุงุชููุง C ูู Python ุ ู- ุงูุฎูุงุฑ ุงูุฃุฎูุฑ - ุจุงุณุชุฎุฏุงู
ู
ูุชุจุฉ C ูุจูุฑุฉ ูู Python ุจุฏูู ุฃูู
ูู
ููุงุช pxd.
Cython
ุชู
ุช ูุชุงุจุฉ ุงููุชุจ ุจุงููุนู ุญูู ูุฐุง ุงูู
ูุถูุน ุ ูููุงู ุงูุนุฏูุฏ ู
ู ุงูู
ูุงูุงุช ุ ุจู
ุง ูู ุฐูู ุญูู Habrรฉ ุ ูุฐูู ูู ุฃุฑูุฒ ูุซูุฑูุง ุนูู ุงูุชุซุจูุช ุฃู ุจุนุถ ุงูุฃุดูุงุก ุงูุฃุณุงุณูุฉ. ุงูุฑุฃ ุงูู
ุฒูุฏ ููุง
ุจุงุณุชุฎุฏุงู
Cython ุ ูู
ูููุง ุญู ุงูุนุฏูุฏ ู
ู ุงูู
ุดุงูู. ุจุงููุณุจุฉ ุฅูู ุจุนุถ ู
ุซููุงุช ุงูููุฏ C ูู ุจูุซูู ุ ูุฅูู ููุงุณุจ ุงูู
ุดููุฉ ุจุดูู ุนุงู
ูุฌุฒุฆููุง ู
ุน ูุงุฑุฏุงุช ุงูู
ูุชุจุฉ.
ุฏุนููุง ูููู ูุธุฑุฉ ุนูู ู
ุซุงู ุจุณูุท ู
ู ุงููุซุงุฆู ุงูุฑุณู
ูุฉ.
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
.
.pyx ูู ุชูุณูู ุฎุงุต ูู
ููุงุช Cython ุ ูุงูุฐู ูุดุจู .c ููุฑู
ุฒ C ููุญุชูู ุนูู ุจุนุถ ุงููุธุงุฆู. ููุฌุฏ ุฃูุถูุง .pxd ุ ูู C ูููู ูู .h ููุญุชูู ุนูู ูุตู ูููุธุงุฆู ุ ุงูููุงูู ุ ุฅูุฎ.
ููุชูุงุนู ุจุทุฑููุฉ ู
ุง ู
ุน ูุธููุฉ fib ุ ูุญุชุงุฌ ุฅูู "ุชุฑุฌู
ุฉ" ุงูููุฏ. ููููุงู
ุจุฐูู ุ ูู
ุจุฅูุดุงุก setup.py
ุจุงุณุชุฎุฏุงู
ูุฐุง ุงูู
ุญุชูู.
from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("fib.pyx"), )
ุจุนุฏ ุชุดุบูู python3 setup.py build_ext --inplace
ูู
ููู ุงุณุชูุฑุงุฏู ูู ุจูุซูู ู
ูุชุธู
ูุงูุงุณุชู
ุชุงุน ุจุณุฑุนุฉ ุงูุนู
ู ู
ุซู ุทุจูุนู ูุบุงุช ู
ุชุฑุฌู
ุฉ.
import fib fib.fib(2000)
ููู ููุง ูุชุจูุง ุดูุฑุฉ Python ููู
ูุง ุจุชุญููููุง ุฅูู C ุ ูููู ู
ุงุฐุง ุนู ูุชุงุจุฉ ุดูุฑุฉ C ูุชุดุบูููุง ูู Pythonุ
ููุณุช ู
ุดููุฉ ูุญู ููุดุฆ ู
ุฌูุฏูุง ุฌุฏูุฏูุง ุ ููู ุงูุฏุงุฎู ูููู
ุจุฅูุดุงุก ู
ุฌูุฏ lib
ุงูุฐู lib/include
ู lib/src
ุ ูู ุงููุงูุน ุ ูุฅู ูู ู
ู ุนู
ู ู
ุน C ูุนุฑู ุจุงููุนู ู
ุงุฐุง ุณูููู ููุงู. ูู ุงูู
ุฌูุฏ ุงูุฑุฆูุณู ุ ูู
ุจุฅูุดุงุก ู
ุฌูุฏ python_wrap
ุขุฎุฑ.
ุฏุนูุง struct.h
ุฅูู lib/include
ููู
ุจุฅูุดุงุก struct.h
ุ ุญูุซ struct.h
ูุธููุฉ ูุงุญุฏุฉ ููุฑู ููููุฉ ุงูุชุนุงู
ู ู
ุน ุงูููุงูู ูู C ุฅูู Cython.
typedef struct struct_test{ int a; int b; } struct_test; int minus(struct_test a);
ูููู
ุจุฅูุดุงุก ู
ูู ุขุฎุฑ ุ ูุงูุฐู include.h
ุนููู 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; }
ูุนู
ุ ุฃูุง ูุง ุฃุฏุนู ุฃู ุฃููู ุฃุตูููุง ููุฃุณู
ุงุก ุงูู
ุชุบูุฑุฉ ุ ููููุง ุงูุชูููุง ุชูุฑูุจูุง ู
ู ุงูุฌุฒุก C. ู
ุงุฐุง ุจุนุฏุ ุฃุถู 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)
ุฃุณุชุฎุฏู
ููุง ู
ูููุง ุตุบูุฑูุง ูููู ุจููุฉ ู
ุฌู
ูุน Python ุฅูู ุฏููู ุงูุจููุฉ ุญุชู ุชุชู
ูู ู
ู ุชุฑุฌู
ุฉ ู
ููุงุช Python. ูุฏ ูุง ูููู ูุฐุง ุถุฑูุฑููุง ุฅุฐุง ูู
ุช ุจุชู
ุฑูุฑ ุงูู
ุณุงุฑุงุช ุงููุณุจูุฉ ุฅูู ุฏููู 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
ุจุฅูุดุงุก ู
ูููู 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"
ุ ูุดูุฑ ุฅูู ุงูู
ูู ุงูุฐู cdef extern from "include/include.h"
. ุจุนุฏ ุฐูู ุ ูุฃุชู ุจูุงุก ctypedef struct struct_test:
ูุตู ูููููู ุจุญูุซ ูู
ูู ุงุณุชุฎุฏุงู
ู ู
ู ููุฏ Python. ูู ุงูููุงูุฉ ุ ูู ุงููุงูุน ุ ูุตู ูุธููุชูู. ุฃุฑูุฏ ุฃู ุฃุดูุฑ ุฅูู ุฃููุง ุจุญุงุฌุฉ ุฅูู ูุตู ูู ู
ุง ูู ู
ูุฌูุฏ ูู include.h
ุ ุฅุฐุง ูุงู ูุณุชูุฑุฏ ุจููุฉ ููุธููุฉ ู
ู ู
ูู ุฑุฃุณ ุขุฎุฑ ุ ูุฅููุง ูุนุชูุฏ ุฃู ูู ูุฐุง ู
ูุฌูุฏ ูู ู
ูู ูุงุญุฏ.
ูู main.pyx
ููุชุจ ูุธุงุฆู ุงูุงูุชูุงู ู
ู Python ุฅูู C. ูุฐุง ููุณ ุถุฑูุฑููุง ุ ูููู ูู
ุงุฐุง ูุชู
ุชุญู
ูู ููุฏ Python ุจููุงูู C. ูุฅูุดุงุก ูููู ุ ูููู ุชุนุฑูู ูุงู
ูุณ ุจูู ุงูู
ุนูู
ุงุช.
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)
ู
ู ุฃุฌู ุชุฑุฌู
ุฉ ุฑู
ุฒ C ูุชุฌู
ูุน ู
ูุชุจุชูุง ุ ุณูููู
ุจุฅูุดุงุก ุจุฑูุงู
ุฌ ูุตู ุจุณูุท ููุจุงุด.
ูุญู ุฅุทูุงู ูุงูุชุญูู
$ 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
ุญุณููุง ุ ุจุงูุนูุฏุฉ ุฅูู ู
ุณุฃูุฉ ุงูู
ูุชุจุงุช ุงูู
ุซุจุชุฉ ุจุงููุนู ุ ููููุชุฑุถ ุฃููุง ูุฑูุฏ ุฅูุดุงุก ุบูุงู ุนูู ู
ูุชุจุฉ ูููู (ุงูุชู ุชู
ุชุซุจูุชูุง ุจุงููุนู ุนูู ุงููุธุงู
ุจุฃู ุทุฑููุฉ ู
ูุงุฆู
ุฉ) ุ ูู
ุง ูู ู
ูุถุญ ูู Readme Stypesgen.
$ 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']
ุฃุฎูุฑูุง ุ ุฑุงุจุท ุฅูู ุฌูุซุจ ุ ููู ูู
ูู ุฃู ูููู ุจุฏููู.