Как настроить порядок установки зависимостей в файле setup.py или pip? - PullRequest
10 голосов
/ 14 февраля 2011

У меня есть пакет Python с его setup.py с зависимостями, объявленными обычным способом, в install_requires = [...].В одном из пакетов, scikits.timeseries, есть файл setup.py, ожидающий, что numpy уже установлен, поэтому я бы хотел, чтобы сначала был установлен numpy.В этом случае и вообще можно ли управлять порядком установки зависимостей?Как?

В настоящее время порядок, в котором setup.py опускает зависимости (как указано в arg install_requires), кажется практически случайным.Кроме того, в setup.py setup (...) я попытался использовать arg:

extras_require={'scikits.timeseries': ['numpy']}

... безуспешно, порядок установки зависимостей не изменился.

Я такжепопытался настроить файл требований pip, но там также порядок установки зависимостей в pip не соответствовал порядку строк файла требований, поэтому не повезло.

Другой возможностью было бы иметь системный вызов рядомначало setup.py, чтобы установить numpy перед вызовом setup (...), но я надеюсь, что есть лучший способ.Заранее спасибо за любую помощь.

Ответы [ 4 ]

5 голосов
/ 15 февраля 2011

Если scikits.timeseries нужно numpy, тогда оно должно быть объявлено как зависимость. Если бы это было так, то pip справился бы с вами (я уверен, что setuptools тоже бы это сделал, но я давно этим не пользовался) Если вы управляете scikits.timeseries, то вам следует исправить его объявления зависимостей.

0 голосов
/ 19 января 2019

Вот решение, которое действительно работает.Это не слишком «приятный» метод, к которому нужно прибегать, но «отчаянные времена ...».

По сути, вам необходимо:

  • Переопределить команду setuptools ""class (плюс тесно связанные аналоги)
  • Выполнить пункт из сценария с помощью операторов командной строки, для которых вы можете принудительно установить порядок

Недостатки этого:

  • Пип должен быть установлен.Вы не можете просто выполнить setup.py в среде без этого.
  • Вывод на консоль начальных «предварительных» установок не появляется по какой-то странной причине.(Возможно, я опубликую здесь обновление, исправляющее это ...)

Код:

from setuptools import setup

# Override standard setuptools commands. 
# Enforce the order of dependency installation.
#-------------------------------------------------
PREREQS = [ "ORDERED-INSTALL-PACKAGE" ]

from setuptools.command.install import install
from setuptools.command.develop import develop
from setuptools.command.egg_info import egg_info

def requires( packages ): 
    from os import system
    from sys import executable as PYTHON_PATH
    from pkg_resources import require
    require( "pip" )
    CMD_TMPLT = '"' + PYTHON_PATH + '" -m pip install %s'
    for pkg in packages: system( CMD_TMPLT % (pkg,) )       

class OrderedInstall( install ):
    def run( self ):
        requires( PREREQS )
        install.run( self )        

class OrderedDevelop( develop ):
    def run( self ):
        requires( PREREQS )
        develop.run( self )        

class OrderedEggInfo( egg_info ):
    def run( self ):
        requires( PREREQS )
        egg_info.run( self )        

CMD_CLASSES = { 
     "install" : OrderedInstall
   , "develop" : OrderedDevelop
   , "egg_info": OrderedEggInfo 
}        
#-------------------------------------------------

setup ( 
     ...
    install_requires = [ "UNORDERED-INSTALL-PACKAGE" ],
    cmdclass = CMD_CLASSES
)
0 голосов
/ 15 июля 2016

Используйте параметр setup_requires, например, для установки numpy до scipy и __builtins__.__NUMPY_SETUP__ = False хука, чтобы правильно установить numpy:

setup(
    name='test',
    version='0.1',
    setup_requires=['numpy'],
    install_requires=['scipy']
)

def run(self):
    __builtins__.__NUMPY_SETUP__ = False
    import numpy
0 голосов
/ 20 июня 2016

Вы можете добавить numy в раздел setup_requires:

setup_requires=['numpy'],
...