首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在setup.py或pip需求文件中,如何控制安装包依赖的顺序?

在setup.py或pip需求文件中,如何控制安装包依赖的顺序?
EN

Stack Overflow用户
提问于 2011-02-15 03:52:33
回答 4查看 7.2K关注 0票数 15

我有一个Python包,它的setup.py通过通常的方式在install_requires=中声明了依赖关系……其中的一个包,scikits.timeseries,有一个setup.py,期望已经安装了numpy,因此,我想先安装numpy。对于这种情况,通常情况下,依赖项安装的顺序可以控制吗?多么?

目前,setup.py下拉依赖项(如arg install_requires中所列)的顺序看起来几乎是随机的。此外,在setup.py设置中(...)我尝试使用arg:

代码语言:javascript
运行
复制
extras_require={'scikits.timeseries': ['numpy']}

...without成功,安装依赖项的顺序不受影响。

我还尝试设置了一个pip需求文件,但同样,pip安装依赖项的顺序与需求文件的行顺序不匹配,所以不走运。

另一种可能是在靠近setup.py顶部的位置进行系统调用,以便在安装之前安装numpy (...)打电话,但我希望有更好的方法。提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-15 23:17:17

如果scikits.timeseries需要numpy,那么它应该将其声明为依赖项。如果是这样的话,pip会帮你处理事情(我很确定setuptools也会这样做,但我已经很久没用过它了)。如果你控制了scikits.timeseries,那么你应该修复它的依赖声明。

票数 6
EN

Stack Overflow用户

发布于 2016-07-16 00:02:40

使用setup_requires参数,例如安装numpy之前的scipy,将其放入setup_requires中,并添加__builtins__.__NUMPY_SETUP__ = False钩子以正确安装numpy:

代码语言:javascript
运行
复制
setup(
    name='test',
    version='0.1',
    setup_requires=['numpy'],
    install_requires=['scipy']
)

def run(self):
    __builtins__.__NUMPY_SETUP__ = False
    import numpy
票数 4
EN

Stack Overflow用户

发布于 2019-01-20 00:53:35

这是一个实际有效的解决方案。这不是一种必须求助于的过于“愉快”的方法,而是“绝望的时刻……”。

基本上,你必须:

安装命令覆盖setuptools "install

  • “类(以及通过命令行语句从脚本中获得的密切相关的analogs)

  • Execute pip,您可以为其强制执行order

这样做的缺点是:

必须安装

  • Pip。您不能只在没有它的环境中执行setup.py
  • 由于某种奇怪的原因,初始“先决条件”安装的控制台输出没有出现。(也许我会在这里发布一个更新,解决这个问题...)

代码:

代码语言:javascript
运行
复制
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
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4996589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档