使用 LoadLibrary 在 .pyd 中发布加载 cython cdef 函数
Issue loading cython cdef functions in a .pyd using LoadLibrary
我正在尝试在 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 = [] 以强制函数在 windows.
中可见
setup(
name= "foo",
ext_modules = cythonize(Extension('foo',sources=
["foo.pyx"],export_symbols=['foo_func'])),
include_dirs = [numpy.get_include()]
)
我正在尝试在 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 = [] 以强制函数在 windows.
中可见setup(
name= "foo",
ext_modules = cythonize(Extension('foo',sources=
["foo.pyx"],export_symbols=['foo_func'])),
include_dirs = [numpy.get_include()]
)