我正在使用Cython将一组C函数包装到一个模块中。我希望能够将第一个模块cimport到随后的基于Cython的项目中,但是在python脚本中导入派生模块时,我遇到了一个“未定义符号”的问题。在
考虑以下在不同目录中开发的两个模块的最小工作示例:
# exModA wraps the functions provided in exModAFxn.c
exModA/
__init__.pxd
__init__.py
exModAFxn.c
exModA.pyx
setup.py
# exModB attempts to use the cdef functions from exModA
exModB/
__init__.py
exModB.pyx
setup.py
# The test script attempts to make use of exModB
test.py
exModA/初始化pxd:
^{pr2}$exModA/\uu init\uy.py:
from exModA import *
exModA/exModAFxn.c.公司:
#include <stdio.h>
void myCMessage() { printf( "This is a test!\n" ); }
exModA公司/exModA.pyx文件公司名称:
cdef extern from "exModAFxn.c" :
void myCMessage()
# Use myCMessage in a python function
def foo() :
myCMessage()
exModA公司/设置.py公司名称:
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(
name = 'exModA',
ext_modules = cythonize( ['exModA/exModA.pyx'] ),
)
exModB/\uu init_uu.py:
from exModB import *
exModB公司/exModB.pyx附件公司名称:
cimport exModA
# Use a cdef function from exModA in a python function
def bar() :
exModA.myCMessage()
exModB公司/设置.py公司名称:
from distutils.core import setup, Extension
from Cython.Build import cythonize
setup(
name = 'exModB',
ext_modules = cythonize( ['exModB/exModB.pyx'] ),
)
在测试.py脚本在编译两个cython模块后调用。在
python extModA/setup.py build_ext --inplace
python extModB/setup.py build_ext --inplace
在测试.py公司名称:
import exModA
exModA.foo() # successfully prints message
import exModB # raises ImportError: undefined symbol: myCMessage
exModB.bar() # we never get to this line :(
成功打印来自exModA.foo公司函数告诉我myCMessage实际上是可用的,但在导入exModB时却找不到它。我知道如果我将exModA和exModB合并到一个项目中,这个问题就会消失,但是如果可能的话,我希望避免这种方法——我正在尝试为一个C库公开一组通用的包装器,以便在几个不同的应用程序中使用。在
我可以通过执行以下操作来实现:
首先,在
exModB/setup.py
文件中指定用于链接的exModA
库,如下所示:(我建议将
exModA.so
移动到库搜索路径上的文件夹中,而不是指定运行库目录。){{cd3>也可以找到exModA.so之后,但在生成
^{pr2}$exModB.so
之前执行此操作:你可能会想调整一下,但它应该让你开始。在
相关问题 更多 >
编程相关推荐