Создайте колесо для пакета (например, scipy), в котором отсутствует декларация зависимости

Я думаю, что здесь неважно, но я использую Python 2.7.

Итак, общая часть моего вопроса такова: я использую отдельный virtualenv для каждого из моих проектов. У меня нет доступа администратора, и я вообще не хочу возиться с системными пакетами. Естественно, я хочу использовать колеса, чтобы ускорить обновления пакетов и установки в virtualenv s. Как я могу построить колесо, зависимости которого удовлетворяются только в пределах определенного virtualenv?

В частности, выдача

pip wheel -w $WHEELHOUSE scipy

не работает с

Building wheels for collected packages: scipy
  Running setup.py bdist_wheel for scipy
  Destination directory: /home/moritz/.pip/wheelhouse
  Complete output from command /home/moritz/.virtualenvs/base/bin/python -c "import setuptools;__file__='/home/moritz/.virtualenvs/base/build/scipy/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /home/moritz/.pip/wheelhouse:
  Traceback (most recent call last):

  File "<string>", line 1, in <module>

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 237, in <module>

    setup_package()

  File "/home/moritz/.virtualenvs/base/build/scipy/setup.py", line 225, in setup_package

    from numpy.distutils.core import setup

ImportError: No module named numpy.distutils.core

----------------------------------------
  Failed building wheel for scipy
Failed to build scipy
Cleaning up...

потому что numpy не присутствует в глобальном масштабе, а при создании колеса работает, когда активна установка virtualenv с numpy, кажется ужасной идеей, чтобы колесо зависело от конкретной версии virtualenv numpy.

pandas, который также зависит от numpy, кажется, устанавливает свои собственные компоненты numpy, но я не уверен, что лучшее решение.

Я мог бы установить numpy с помощью --user и использовать его для сборки колеса scipy. Есть ли лучшие варианты?

Ответы

Ответ 1

Описание проблемы

  • Имейте пакет python (например, scipy), который зависит от других пакетов (например, numpy), но setup.py не объявляет это требование/зависимость.
  • Построение колесика для такого пакета будет успешным в случае, если текущая среда предоставляет необходимый пакет (ы).
  • В случае, если требуемые пакеты недоступны, создание колеса не будет выполнено.

Примечание. Идеальное решение - исправить сломанный setup.py, добавив требуемое объявление пакета. Но это в основном нецелесообразно, и нам нужно идти другим путем.

Решение: сначала установите требуемые пакеты

Процедура (для установки scipy, которая требует numpy), имеет два шага

  • постройте колеса.
  • используйте колеса для установки необходимого вам пакета.

Заполните рулевую рубку с необходимыми колесами

Это нужно сделать только один раз и многократно использовать его повторно.

  • правильно настроили конфигурацию пифа, чтобы разрешить установку с колес, каталог рулевой рубки настроен и перекрывается с download-cache и find-links, как в следующем примере pip.conf:

    [global]
    download-cache = /home/javl/.pip/cache
    find-links = /home/javl/.pip/packages
    
    [install]
    use-wheel = yes
    
    [wheel]
    wheel-dir = /home/javl/.pip/packages
    
  • установить все необходимые системные библиотеки для всех пакетов, которые необходимо скомпилировать

  • построить колесо для требуемого пакета (numpy)

    $ pip wheel numpy
    
  • настроить virtualenv (необходимо только один раз), активировать его и установить там numpy:

    $ pip install numpy
    

    Когда колесо уже готово, оно должно быть быстрым.

  • постройте колесо для scipy (все еще находящееся в virtualenv)

    $ pip wheel scipy
    

    К настоящему времени у вас будет рулевая рубка с колесами, которые вам нужны.

  • Вы можете удалить временный virtualenv, он больше не нужен.

Установка в свежий virtualenv

Я предполагаю, что вы создали новый virtualenv, активировали его и хотите, чтобы там был установлен scipy.

Установка scipy из нового колеса scipy будет по-прежнему терпеть неудачу при отсутствии numpy. Это мы преодолеем, сначала установив numpy.

$ pip install numpy

И затем закончите с scipy

$ pip install scipy

Я думаю, это можно сделать одним звонком (но я его не тестировал)

$ pip install numpy scipy

Повторная установка scipy проверенной версии

Вероятно, что в один момент в будущем будет выпущена новая версия scipy или numpy, и pip попытается установить последнюю версию, для которой в рулевой рубке нет колеса.

Если вы можете жить с версиями, которые вы использовали до сих пор, вы должны создать requirements.txt с указанием версий numpy и scipy, которые вам нравятся, и установить из него.

Это должно обеспечить необходимый пакет, который должен присутствовать до его фактического использования.