Я использую pybind11 и собираю модуль python с помощью setuptools и cmake, как описано в pybind / cmake_example:
setup(
name='libraryname',
...
ext_modules=[CMakeExtension('libraryname')],
cmdclass=dict(build_ext=CMakeBuild),
)
Локально, используя python setup.py sdist build
все хорошо, и я могу использовать и / или установить пакет из сгенерированных файлов.
Теперь я хочу загрузить пакет в PyPI.
Из другого пакета Python я знаю, как создать общую библиотеку Linux (см. Также Вот) манипулируя меткой платформы колеса:
class bdist_wheel(bdist_wheel_):
def finalize_options(self):
from sys import platform as _platform
platform_name = get_platform()
if _platform == "linux" or _platform == "linux2":
# Linux
platform_name = 'manylinux1_x86_64'
bdist_wheel_.finalize_options(self)
self.universal = True
self.plat_name_supplied = True
self.plat_name = platform_name
setup(
...
cmdclass = {'bdist_wheel': bdist_wheel},
)
Как создать соответствующий тег платформы, когда нет bdist_wheel
построено?
Должно ли это быть каким-то образом построено как колесо, а не как расширение (возможно, связано с этот вопрос на GH)?
Кроме того, как pybind11 определяет суффикс сгенерированных библиотек (на моем Linux это не просто .so
но .cpython-35m-x86_64-linux-gnu.so
)?
ValueError: Unknown distribution format: 'libraryname-0.8.0.cpython-35m-x86_64-linux-gnu.so'
Виноват!
Оказывается, путаница произошла из-за ошибки сборки, которая была у меня при первоначальной попытке запуска python setup.py sdist bdist_wheel
,
Вручную строить с python setup.py build
не был правильный подход для публикации пакета.
Заметка: имя .so файла должно быть установлено без -0.8.0
Идентификатор версии для того, чтобы Python мог выполнить импорт с колеса.
Подвести итоги:
Создание и публикация двоичных колес работает точно так же с pybind11, как, например, с. CPython и это должно работать очень хорошо, чтобы следовать pybind / cmake_example.
Других решений пока нет …