Есть несколько вещей, которые нужно исправить или улучшить в вашем скрипте установки.
Объявление зависимостей сборки и времени выполнения
Вместо запуска pip install {numpy,cython}
, когда многие вещи могут go ошибаться, правильный способ объявления зависимостей - передать их setup()
в аргументах setup_requires
/ install_requires
. Cython требуется только на этапе сборки, но не тогда, когда vltools
установлен и импортирован - он будет добавлен в setup_requires
. numpy
требуется как для сборки, так и для запуска пакета, поэтому он включен в оба списка:
setup(
...,
setup_requires=["cython", "numpy"],
install_requires=["numpy"],
)
Преимущество в том, что Cython не будет установлен. Он будет загружен, использован для сборки, а затем удален.
Вы можете (и должны) расширить список install_requires
другими пакетами, для которых требуется vltools
, например scipy
, pillow
et c.
Отсрочка импорта Cython и numpy
Чтобы убедиться, что пакет можно установить в системе, в которой предварительно не установлен ни Cython, ни numpy
, мы должны отложить их импорт. Я не буду go в деталях здесь; проверьте Добавьте numpy .get_include () аргумент в setuptools без предустановленного numpy для получения дополнительной информации. В пользовательском значении команды build
, приведенной ниже, я откладываю как заголовки расширения, так и расширения на * c: *
Упаковка nms.h
В настоящее время nms.h
не добавляется в исходный дистрибутив, что делает установку невозможной. Это легко исправить, добавив, например, package_data
:
setup(
...,
package_data={"vltools.nms": ["nms.h"]},
)
Теперь вы также должны добавить родительский каталог nms.h
к include_dirs
:
exts = [Extension(name='vltools.nms.nms_ext',
sources=["vltools/nms/_nms_ext.c", "vltools/nms/nms_ext.pyx"],
include_dirs=["vltools/nms"])]
Полная настройка сценарий
import os
from setuptools import setup, find_packages
from setuptools import Extension
from distutils.command.build import build as build_orig
__version__ = "0.1.0b3"
exts = [Extension(name='vltools.nms.nms_ext',
sources=["vltools/nms/_nms_ext.c", "vltools/nms/nms_ext.pyx"],
include_dirs=["vltools/nms"])]
class build(build_orig):
def finalize_options(self):
super().finalize_options()
__builtins__.__NUMPY_SETUP__ = False
import numpy
for extension in self.distribution.ext_modules:
extension.include_dirs.append(numpy.get_include())
from Cython.Build import cythonize
self.distribution.ext_modules = cythonize(self.distribution.ext_modules,
language_level=3)
setup(name='vltools',
version=__version__,
description='vision and learning tools',
url='https://github.com/vltools/vltools',
author_email='kz@kaizhao.net',
license='MIT',
packages=find_packages(),
ext_modules=exts,
setup_requires=["cython", "numpy"],
install_requires=["numpy"],
zip_safe=False,
data_files=[("data", ["data/imagenet1000_clsidx_to_labels.txt"])],
package_data={"vltools.nms": ["nms.h"]},
cmdclass={"build": build},
)
PS Два года прошло и вот мы снова встретились; -)