Представим, что нам дан готовый исходный код библиотеки на C++ с именем MyAwesomeLib
. Цель состоит в том, чтобы предоставить часть его возможностей python, поэтому мы создаем оболочку, используя swig, и сгенерировали пакет python с именем PyMyAwesomeLib
.
Структура каталогов теперь выглядит так
root_dir
|-src/
|-lib/
| |- libMyAwesomeLib.so
| |- _PyMyAwesomeLib.so
|-swig/
| |- PyMyAwesomeLib.py
|-python/
|- Script_using_myawesomelib.py
Все идет нормально. В идеале все, что нам нужно сделать дальше, это скопировать lib/*.so
swig/*.py
и python/*.py
в соответствующий каталог в site-packages
способом pythonic, т. е. используя
python setup.py install
Однако я очень запутался, пытаясь достичь этой простой цели, используя setuptools
и distutils
. Оба инструмента выполняют компиляцию расширений Python через внутреннюю систему, где исходный файл, флаги компилятора и т. д. передаются с использованием setup(ext_module=[Extension(...)])
. Но это нелепо, так как MyAsesomeLib
имеет полностью функционирующую систему сборки, основанную на makefile. Перенос логики, встроенной в make-файлы, был бы избыточной и совершенно ненужной работой.
После некоторых исследований кажется, что осталось два варианта: я могу либо переопределить setuptools.command.build
и setuptools.command.install
, чтобы использовать существующий make-файл и напрямую скопировать результаты, либо я могу каким-то образом сообщить setuptools
об этих файлах и попросить его скопировать их во время установки. Второй способ более привлекателен, но именно он вызывает у меня больше всего головной боли. Я безуспешно пробовал следующие варианты
package_data
иinclude_package_data
не работают, потому что файлы *.so не находятся под контролем версий и не входят ни в один пакет.data_files
не работает, так как файлы включаются только при запускеpython setup.py sdist
, но игнорируются приpython setup.py install
. Это противоположно тому, что я хочу. Файлы.so
не должны быть включены в исходный дистрибутив, а должны быть скопированы на этапе установки.MANIFEST.in
не удалось по той же причине, что иdata_files
.eager_resources
тоже не работает, но если честно я не знаю разницы междуeager_resources
иdata_files
илиMANIFEST.in
.
Я думаю, что это на самом деле обычная ситуация, и я надеюсь, что есть простое решение. Любая помощь будет принята с благодарностью.