Проблема загрузки функций cdef для Cython в .pyd с использованием LoadLibrary - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь динамически загрузить cythonized .pyd в C ++.На Linux-машине создается файл .so.

Используя .so, я могу сделать следующее:

plugin = dlopen("foo.so", RTLD_LAZY);
init = dlsym(plugin, "PyInit_foo); // This works!
cfunc = dlsym(plugin, "foo_func"); // This works!
dlclose(plguin);

Что прекрасно работает!


Однако в Windows я хочу сделать следующее:

plugin = LoadLibraryA("foo.pyd");
init = GetProcAddress(plugin, "PyInit_foo"); // This works!
cfunc = GetProcAddress(plugin, "foo_func"); // This doesn't work..
freeLibrary(plugin);

Это моя проблема!foo_func не существует в .pyd, даже если он находится в .so

Оба сделаны с использованием одного и того же setup.py:

from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy

setup(
        name= "foo",
        ext_modules = cythonize("foo.pyx"),
        include_dirs = [numpy.get_include()]
        )

И пример foo.pyx

cdef public void foo_func(int i) with gil:
    print(i)

Итак, я посмотрел на .pyd, используя dumpbin /exports foo.pyd.И единственная функция - PyInit_foo.Таким образом, кажется, что .pyd отличается от .so.При использовании objdump -T foo.so в Linux все функции есть!

Нужно ли по-разному цифонизировать файл для Windows?Что еще может отличаться здесь?

1 Ответ

0 голосов
/ 06 марта 2019

Мне нужно было заставить cython экспортировать функции как видимые.Для этого добавьте export_symbols = [], чтобы функции были видны в окнах.

setup(
        name= "foo",
        ext_modules = cythonize(Extension('foo',sources= 
        ["foo.pyx"],export_symbols=['foo_func'])),
        include_dirs = [numpy.get_include()]
        )
...