使用LoadLibrary在.pyd中发布加载cython cdef函数

时间:2019-01-29 19:57:39

标签: cython loadlibrary pyd

我正在尝试在c ++中动态加载经过cythonized的.pyd。在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)

因此,接下来我使用dumpbin /exports foo.pyd查看.pyd。唯一的函数是PyInit_foo。因此,似乎.pyd与.so不同。在Linux中使用objdump -T foo.so时,所有功能都已存在!

对于Windows,我是否需要以不同的方式对文件进行cythonize?这里还有什么不同?

1 个答案:

答案 0 :(得分:1)

我需要强制cython将功能导出为可见的。为此,请添加export_symbols = []以强制功能在Windows中可见。

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