Я решил провести рефакторинг моей C оболочки API и углубиться в аргумент libraries
в setuptools.setup
Моя структура проекта следующая:
|setup.py
|my_pkg
|--|ext_c_lib
|--|--|include
|--|--|--|c_file.h
|--|--|--|c_types.h
|--|--|src
|--|--|--|c_file.c
|--|cy_lib
|--|--|pxd_include
|--|--|--|__init__.py
|--|--|--|c_file.pxd # functions redefined `with cdef exten from "c_file.h"`
|--|--|--|c_types.pxd # types redefined `with cdef exten from "c_types.h"`
|--|--|__init__.py
|--|--|utils.pyx # uses types from c_types.pxd
|--|--|cy_file.pyx # uses funcs from c_file.c/c_file.pxd
utils.pyx:
from my_pkg.cylib.pxd_include.c_types cimport SOME_CUSTOM_TYPE
...
cy_file.pyx:
from my_pkg.cylib.pxd_include.c_file cimport c_func
cdef cy_func(arg):
arg += 1
return c_func(arg)
setup.py:
...
extensions = [Extension('my_pkg.cy_lib.utils', ['my_pkg/cy_lib/utils.pyx']),
Extension('my_pkg.cy_lib.cy_file', ['my_pkg/cy_lib/cy_file.pyx',
'my_pkg/ext_c_lib/src/c_file.c']),]
setup(name='my_pkg', ext_modules=extensions, include_dirs=['my_pkg/ext_c_lib/include'])
Поскольку ext_c_lib
не зависит от меня и выпускает довольно редко я хотел бы создать ее как внешнюю библиотеку с python setup.py build_clib
, а затем использовать ее в файлах Cython, чтобы я мог избавиться от файлов pxd и откомпилировать c_file.c
один раз, даже если я добавлю отдельный файл Cython, использующий функции из c_file.c
. Это возможно?
Я ожидаю что-то вроде: setup.py:
...
external = ('external', {'sources': ['my_pkg/ext_c_lib/src/c_file.c']})
extensions = [Extension('my_pkg.cy_lib.utils', ['my_pkg/cy_lib/utils.pyx']),
Extension('my_pkg.cy_lib.cy_file', ['my_pkg/cy_lib/cy_file.pyx']),]
setup(name='my_pkg', libraries=external,
ext_modules=extensions, include_dirs=['my_pkg/ext_c_lib/include'])
utils.pyx:
from external cimport SOME_CUSTOM_TYPE
...
cy_file.pyx:
from external cimport c_func
cdef cy_func(arg):
arg += 1
return c_func(arg)
Конечно, этот код не компилируется, как я получаю external.pxd not found