`python setup.py sdist` с расширением cython: .pyx 'не соответствует ни одному файлу - PullRequest
1 голос
/ 17 марта 2020

Я поддерживаю пакет python, который включает расширение c на основе Cython. Исходный код на github: https://github.com/vlkit/vlkit.

Вот мой setup.py:

import os
from setuptools import setup, find_packages
from distutils.core import Extension

try:
    import numpy
except ImportError:  # We do not have numpy installed
    os.system("pip install numpy")

try:
    from Cython.Build import cythonize
except ImportError:  # We do not have Cython installed
    os.system("pip install Cython")

import numpy
from Cython.Build import cythonize

__version__ = "0.1.0-b3"

exts = [Extension(name='vltools.nms.nms_ext',
                  sources=["vltools/nms/nms_ext.pyx"],
                  include_dirs=[numpy.get_include()])
        ]

setup(name='vltools',
  version=__version__,
  description='vision and learning tools',
  url='https://github.com/vltools/vltools',
  author_email='a@b.c',
  license='MIT',
  packages=find_packages(),
  ext_modules=cythonize(exts),
  zip_safe=False,
  data_files=[("data", ["data/imagenet1000_clsidx_to_labels.txt"])]
)

При локальной сборке с python setup build && python setup.py install все идет гладко .

Однако, когда я пытаюсь создать исходный дистрибутив с python setup.py sdist, а затем установить его из сгенерированного dist/vltools-0.1.0b3.tar.gz, возникает ошибка:

ValueError: 'vltools/nms/nms_ext.pyx' doesn't match any files

Насколько я понимаю, для установки действительно необходим nms_ext.c, который действительно находится внутри сгенерированного dist/vltools-0.1.0b3.tar.gz.

Однако в моем файле setup.py в исходных текстах указано "nms_ext.pyx":

exts = [Extension(name='vltools.nms.nms_ext',
                  sources=["vltools/nms/nms_ext.pyx"],
                  include_dirs=[numpy.get_include()])
        ]

Так что же мне делать при создании исходного дистрибутива с python setup.py sdist?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Есть несколько вещей, которые нужно исправить или улучшить в вашем скрипте установки.

Объявление зависимостей сборки и времени выполнения

Вместо запуска 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 Два года прошло и вот мы снова встретились; -)

1 голос
/ 19 марта 2020

Поскольку @ hoefling предложил , я обновил свой setup.py.

Однако при установке из файла .tar.gz по-прежнему возникает ошибка, из-за которой не удается найти 'vltools / nms / nms_ext.pyx '.

setup.py hoefling опубликовано:

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},
)

При установке с python setup.py sdist && cd dist && pip install vltools-0.1.0b3.tar.gz появляется сообщение об ошибке:

ValueError: 'vltools/nms/nms_ext.pyx' doesn't match any files

Поскольку файл pyx не был упакован в tar.gz.

Чтобы иметь файл 'vltools / nms / nms_ext.pyx' в файле tar.gz, я добавляю его в package_data список:

package_data={"vltools.nms": ["nms.h", "nms_ext.pyx"]}

Наконец, мой полный файл setup.py:

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", "nms_ext.pyx"]},
    cmdclass={"build": build},
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...