Python 为缺少依赖项声明的包(如scipy)构建控制盘

Python 为缺少依赖项声明的包(如scipy)构建控制盘,python,scipy,pip,virtualenv,python-wheel,Python,Scipy,Pip,Virtualenv,Python Wheel,我认为这没有什么区别,但我使用的是Python2.7 因此,我的问题的一般部分如下:我为我的每个项目使用一个单独的virtualenv。我没有管理员权限,我也不想弄乱系统安装的软件包。当然,我想使用wheels来加速整个virtualenvs的软件包升级和安装。如何构建其依赖关系仅在特定的virtualenv中满足的控制盘 具体来说,发行 pip wheel -w $WHEELHOUSE scipy 失败于 Building wheels for collected packages: sci

我认为这没有什么区别,但我使用的是Python2.7

因此,我的问题的一般部分如下:我为我的每个项目使用一个单独的
virtualenv
。我没有管理员权限,我也不想弄乱系统安装的软件包。当然,我想使用wheels来加速整个
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...
为收集的包构建控制盘:scipy
为scipy运行setup.py b列表\u控制盘
目的地目录:/home/moritz/.pip/wheelhouse
从命令/home/moritz/.virtualenvs/base/bin/python-c“导入setuptools;uu文件uu='/home/moritz/.virtualenvs/base/build/scipy/setup.py';exec(编译(打开(uu文件u).read().replace('\r\n','\n'),u文件u,'exec'))”bdist wheel-d/home/moritz/.pip/wheelhouse:
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/moritz/.virtualenvs/base/build/scipy/setup.py”,第237行,在
安装程序包()
文件“/home/moritz/.virtualenvs/base/build/scipy/setup.py”,第225行,在setup\u包中
从numpy.distutils.core导入设置
ImportError:没有名为numpy.distutils.core的模块
----------------------------------------
无法为scipy构建控制盘
未能生成scipy
清理。。。
由于
numpy
不是全局存在的,并且当安装了
numpy
virtualenv
处于活动状态时,构建控制盘工作,因此让控制盘依赖于特定的
virtualenv
版本的
numpy
似乎是个糟糕的主意

pandas
也依赖于
numpy
似乎安装了自己的
numpy
组件,但我不确定这是最好的解决方案

我可以使用
--user
安装
numpy
,并使用它来构建
scipy
控制盘。有更好的选择吗?

问题描述
  • 拥有一个python包(比如
    scipy
    ),它依赖于其他包(比如
    numpy
    ),但是
    setup.py
    没有声明该需求/依赖性
  • 如果当前环境提供了所需的包,则为此类包构建控制盘将成功
  • 如果所需的软件包不可用,构建轮子将失败
注意:理想的解决方案是通过添加所需的包声明来纠正损坏的
setup.py
。但这在很大程度上是不可行的,我们必须走另一条路

解决方案:首先安装所需的软件包 该过程(用于安装需要
numpy
scipy
)有两个步骤

  • 造轮子
  • 使用控制盘安装所需的软件包
  • 用您需要的车轮填充驾驶室 这只需要做一次,然后可以重复使用多次

  • 已正确配置pip配置,以便允许从wheels安装,wheelhouse目录已设置,并与
    下载缓存
    查找链接
    重叠,如下面的
    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

  • 设置virtualenv(只需一次),激活它并在那里安装
    numpy

    $ pip install numpy
    
    当车轮准备好时,它应该很快

  • scipy
    构建控制盘(仍在virtualenv中)

    到现在为止,您将有您需要的车轮填充您的驾驶室

  • 您可以删除临时virtualenv,不再需要它

  • 安装到fresh virtualenv中 我假设,您已经创建了新的virtualenv,激活了它,并希望在那里安装
    scipy

    如果缺少
    numpy
    ,直接从新
    scipy
    控制盘安装
    scipy
    ,仍将失败。我们首先通过安装
    numpy
    来克服这个问题

    $ pip install numpy
    
    然后用scipy结束

    $ pip install scipy
    
    我想,这可以在一次调用中完成(但我没有测试它)

    重复安装经验证版本的scipy 很可能,在未来某一时刻,
    scipy
    numpy
    的新版本将发布,pip将尝试安装驾驶室中没有车轮的最新版本

    如果您可以使用到目前为止使用过的版本,则应创建
    requirements.txt
    ,说明您喜欢的
    numpy
    scipy
    版本,并从中安装


    这将确保所需的软件包在真正使用之前就已经存在。

    我的设置与您在链接答案中描述的基本相同,但是,您在这里写的内容我并不清楚。如果不满足
    numpy
    依赖关系,就无法构建
    scipy
    控制盘。它需要C代码才能编译。@midnight
    scipy
    似乎是一个非常复杂的解决方案,不容易安装。我可能估计得太快了,wheel很容易构建,目前我正在尝试这样做,但如果失败,我将删除或更新我的答案。@midnight注意:wheel不会阻止编译您的包(如numpy),它只允许执行一次(通过
    pip wheel
    )然后快速安装。若它是基于C的包,那个么它将需要编译,除非你们有一个鸡蛋把它重建成轮子。@midnight我做了。答案中描述。那么您使用哪个
    numpy
    构建
    scipy
    控制盘?
    $ pip install numpy
    
    $ pip install scipy
    
    $ pip install numpy scipy