cython - 使用 LoadLibrary 在 .pyd 中加载 cython cdef 函数时出现问题

标签 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?这里还有什么不同之处?

最佳答案

我需要强制 cython 将函数导出为可见。为此,请添加export_symbols = []以强制函数在窗口中可见。

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

关于cython - 使用 LoadLibrary 在 .pyd 中加载 cython cdef 函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54428733/

相关文章:

c++ - C/C++ 动态链接如何在不同平台上工作?

python - 在 pyd 中实现迭代器

python - Cython 导入错误

python - cython float64 错误,尽管 float32 特别设置

Java System.loadLibrary ("m") 在 AIX 6.1 上失败

c - 将 DLL 加载到用户定义的地址

python - [ orth , pos , tag , lema 和 text ] 的 spaCy 文档

python - Cython Memoryview 作为返回值

c# - 在 C# 中使用 .PYD 文件?