使用另一个cython modu导入cython模块时未定义符号

2024-09-29 23:25:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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库公开一组通用的包装器,以便在几个不同的应用程序中使用。在


Tags: 模块frompyimport名称initsetup公司
1条回答
网友
1楼 · 发布于 2024-09-29 23:25:21

我可以通过执行以下操作来实现:

首先,在exModB/setup.py文件中指定用于链接的exModA库,如下所示:

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

ext = Extension('exModB/exModB',
                sources=['exModB/exModB.pyx'],
                libraries=['exModA'],
                library_dirs=['/home/MyFolder/exModA'],
                runtime_library_dirs=['/home/MyFolder/exModA']
                )
setup(name='exModB', ext_modules = cythonize(ext))

(我建议将exModA.so移动到库搜索路径上的文件夹中,而不是指定运行库目录。)

{{cd3>也可以找到exModA.so之后,但在生成exModB.so之前执行此操作:

^{pr2}$

你可能会想调整一下,但它应该让你开始。在

相关问题 更多 >

    热门问题