Обтекание Cython c lib с помощью setup.py build_clib - PullRequest
0 голосов
/ 20 февраля 2020

Я решил провести рефакторинг моей 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...