我试图用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库的链接。我以为是在安装文件中制作的。顺便说一句,我的测试文件在构建模块的测试文件夹中。
预先感谢您的帮助。
达米恩