15

我有一个 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 顶部附近有一个系统调用,在 setup(...) 调用之前安装 numpy,但我希望有更好的方法。提前感谢您的帮助。

4

4 回答 4

6

如果scikits.timeseries需要numpy,则应将其声明为依赖项。如果确实如此,那么pip将为您处理事情(我很确定setuptools也会,但我已经很长时间没有使用它了)。如果你控制scikits.timeseries,那么你应该修复它的依赖声明。

于 2011-02-15T15:17:16.563 回答
3

使用setup_requires参数,例如安装numpy之前 scipy将其放入 setup_requires 并添加__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
于 2016-07-15T16:02:40.110 回答
1

这是一个实际有效的解决方案。这不是必须诉诸的过于“令人愉快”的方法,而是“绝望的时候......”。

基本上,您必须:

  • 覆盖 setuptools“安装命令”类(加上密切相关的类似物)
  • 通过命令行语句从脚本执行 pip,您可以对其执行命令

这样做的缺点是:

  • 必须安装点子。没有它,你不能只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
)
于 2019-01-19T16:53:35.353 回答
0

您可以将 numpy 添加到 setup_requires 部分:

setup_requires=['numpy'],
于 2016-06-20T09:35:22.107 回答