2013-11-14 5 views
4

Разработка модуля (.pyd) для Python в свободном паскале довольно проста, см. Developing Python Modules with Pascal. Но если я хочу взаимодействовать с numpy, это не так просто. При использовании C для интерфейса с numpy вам необходимо добавить код #include <numpy/arrayobject.h> в код, а также вызвать функцию import_array(); в функции инициализации.Python + Numpy модули в свободном паскале

Есть ли способ взаимодействия с numpy в pascal?

EDIT1

Как уже упоминалось в комментариях под @wilberforce ответ, функция import_array, которая определяется в заголовочных файлах просто импортирует multiarray.pyd модуль в текущий интерпретатор и делает некоторую проверку. Он легко переводится на паскаль, и он работает.

Функции num-C-API вначале не представлены в файле pythonXX.dll, поэтому они не могут быть связаны статически. Статическая или динамическая связь с multarray.pyd не работает для меня.

Итак, обновленный вопрос: есть ли способ получить доступ к функциям C-API, встроенным в multiarray.pyd, из кода, который не является C?

+0

Просто узнал о ключевом слове delphi 'delayed', который позволяет вам загружать функцию из внешней библиотеки по требованию (d2010 +). Он мог бы работать в этой ситуации. Я только на свободном паскале, так что до тех пор, пока он не будет реализован ... – hdrz

ответ

1

Рассматривайте библиотеку numpy как любую другую библиотеку C с точки зрения Паскаля - вам нужно включить заголовок и объявить import_array как функцию externalcdecl.

This guide охватывает детали.

Вам уже нужно было сделать это, чтобы написать модуль расширения Python, чтобы ваш код Pascal мог использовать функции API Python для взаимодействия с объектами Python. Вы можете увидеть это в модификаторах cdecl; external PythonLib; в примере, на который вы ссылаетесь. Возможно, это было непонятно, когда вы это делали.

+1

Проблемы состоят в том, что (1) 'import_array' объявлен в' arrayobject.h' и включает: (2) ни одна из функций numpy не объявлена ​​в dll python и (3) использование 'multiarray.pyd' для внешних функций не работает. – hdrz

+0

'import_array' сопоставляется с функцией' _import_array', что существенно импортирует модуль numpy. Возможно, если я переписал эту функцию в pascal, это сработает. – hdrz

+0

О, я вижу - они определяют статический _import_array в сгенерированном файле заголовка - это противно! (Хотя я уверен, что у них есть свои причины.) – babbageclunk

Смежные вопросы