Cython, удалите зависимость numpy в setup.py

Чтобы создать расширение Cython с использованием numpy, нужно добавить numpy.get_include() в "setup.py":

from setuptools import setup, Extension

setup(
    ...
    include_dirs = [numpy.get_include()]
)

В противном случае возникает такая ошибка:

fatal error: numpy/arrayobject.h: No such file or directory

даже если вы собираете расширение непосредственно из предварительно скомпилированного файла .c.

Очевидное решение - заранее установить numpy.

Но setup.py install установка пакета - это обычный способ установить все зависимости пакета (включая numpy). Есть ли способ избавиться от зависимости от numpy при распространении пакета, т.е. чтобы людям не приходилось устанавливать numpy перед запуском setup.py install?

Я думал о включении numpy .h файлов в дистрибутив, но я боюсь конфликтов версий с существующей numpy-версией пользователя.

Может быть, попробовать импортировать и, если я получу ImportError, включить упакованные файлы .h? Любой стандартный / более простой способ?

Изменить: или есть ли способ принудительно установить numpy до запуска setup()?


person JulienD    schedule 16.06.2016    source источник
comment
(Возможно, это не то, что вы ищете, но) если вы пишете свое расширение Cython с использованием memoryviews, а не ndarrays, вам не нужна зависимость от numpy-заголовков.   -  person DavidW    schedule 16.06.2016
comment
@DavidW, спасибо! Раньше я писал обзоры памяти, но мне сказали, что в этом нет необходимости. Это хороший аргумент, чтобы собрать их.   -  person JulienD    schedule 17.06.2016
comment
Это работает, но представления памяти не могут быть обработаны для многопроцессорной обработки и должны быть возвращены обратно в ndarray (с накладными расходами).   -  person JulienD    schedule 17.06.2016


Ответы (1)


Это может быть некрасиво, но я сделал это для принудительной установки / обновления:

from pkg_resources import parse_version

## Install numpy if it is not found or too old
try:
    import numpy
    if parse_version(numpy.__version__) < parse_version('1.10'):
        print("numpy {} was found but is too old. Upgrading.".format(numpy.__version__))
        raise ImportError
    print("Numpy was found. Build extensions.")
except ImportError:
    print("Building Cython extensions requires numpy. Installing numpy.")
    import pip
    pip_args = ['install', numpy_req]
    pip.main(pip_args)
    import numpy
person JulienD    schedule 16.06.2016