如何编写适当的setup.py文件以使用Cython包装C API

时间:2019-05-08 06:55:42

标签: python c shared-libraries cython

我试图用Cython包装一个C API。能够将Cython生成的共享对象(.so)导入到python文件中,以便通过我的python程序使用C API。

现在,我编写了一个.pxd,.pyx和setup.py文件。我可以使用命令.so生成python3 setup.py build_ext --inplace库。 但是,当我将模块包含在python测试文件中以测试api时,出现错误:

Traceback (most recent call last):
  File "test_wrapper.py", line 5, in <module>
    import py_api
ImportError: libc_api.so: cannot open shared object file: No such file or directory

我的pxd_c_api.pxd文件:

from libc.stdint cimport uint8_t

cdef extern from "c_api.h":
    # Callback
    ctypedef void (*cb_t)(uint8_t *addr, uint8_t cnt, int ipv4, void *usr_param,
                int rpt_num, int total_rpt, char **name)

    cdef void *start(cb_t callback, void *usr_param, int ipv4, int use_mdns)

    cdef int stop(void *ctx)

我的py_api.pyx文件:

from libc.stdint cimport uint8_t

cimport pxd_c_api as capi

cdef void c_callback(uint8_t *addr, uint8_t cnt, int ipv4, void *usr_param,
                int rpt_num, int total_rpt, char **name):
    py_callback = <object>usr_param
    # calling the python callback with random arguments...
    py_callback(0, 0, ipv4, rpt_num, total_rpt, 0)

def start(py_callback, ipv4, use_mdns):
    # Python callback is passed in usr_param
    return <object>capi.start(c_callback, <void*>py_callback, ipv4, use_mdns)

def stop(ctx):
    return capi.stop(<void*>ctx)

我的setup.py:

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

LIBRARY_DIRECTORY = "/path/to/lib"
INCLUDE_DIRECTORY = "/path/to/include"

extension = Extension(
    name="py_api",
    sources=["py_api.pyx"],
    libraries=["c_api"],
    library_dirs=[LIBRARY_DIRECTORY,],
    include_dirs=[INCLUDE_DIRECTORY,]
    )

setup(
    name="py_api",
    ext_modules = cythonize(extension)
)

我猜问题出在我的setup.py文件中,因为我可以导入cython模块(在测试文件中),但是该模块似乎需要与我要包装的c库的链接。我以为是在安装文件中制作的。顺便说一句,我的测试文件在构建模块的测试文件夹中。

预先感谢您的帮助。

达米恩

0 个答案:

没有答案