let foo_bar_print = pywrap_closure 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

let foo_bar_print = pywrap_closure

Поиск

let foo_bar_print = pywrap_closure

 

(fun x -> pytuple_fromarray (pytuple_toarray x)) ;; let sd = pyimport_getmoduledict () ;;

 

let mx = pymodule_new "CamlModule" ;; let cd = pydict_new () ;;

 

let cx = pyclass_new (pynull (), cd, pystring_fromstring

"CamlClass") ;;

 

let cmx = pymethod_new (foo_bar_print,(pynull ()),cx) ;; let _ = pydict_setitemstring (cd, "CamlMethod", cmx) ;;

let _ = pydict_setitemstring (pymodule_getdict mx, "CamlClass",

cx) ;;

 

let _ = pydict_setitemstring (sd, "CamlModule", mx) ;; let _ = pyrun_simplestring

 

("from CamlModule import CamlClass\n" ^ "x = CamlClass()\n" ^

 

"for i in range(100000):\n" ^ " x.CamlMethod(1,2,3,4)\n" ^ "print 'Done'\n")

 

Pyrex

 

Для написания модулей расширения можно использовать специальный язык- Pyrex -который совмещает синтаксисPythonи типы данныхC.КомпиляторPyrexнаписан наPython и превращает исходный файл (например, primes.pyx) в файл на C - готовый для компиляции модуль расширения.ЯзыкPyrexзаботится об управлении памятью,удаляя после себя ставшие ненужными объекты.Пример файла из документации кPyrex (для вычисления простых чисел):

 

def primes(int kmax): cdef int n, k, i cdef int p[1000] result = []

 

if kmax > 1000: kmax = 1000

 

k = 0 n = 2

 

while k < kmax: i = 0


 


while i < k and n % p[i] <> 0: i = i + 1

 

if i == k: p[k] = n k = k + 1

 

result.append(n) n = n + 1

return result

 

В результате применения компилятораPyrex,нехитрой компиляции и компоновки(с помощьюGCC):

 

pyrexc primes.pyx

 

gcc primes.c -c -fPIC -I /usr/local/include/python2.3 gcc -shared primes.o -o primes.so

 

 

Получается модуль расширения с функцией primes():

 

>>> import primes

>>> primes.primes(25)

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53,

59, 61,

 



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 59; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.146 (0.006 с.)