为缺乏依赖声明的包(如scipy)构建轮

时间:2014-06-22 16:27:27

标签: python scipy pip virtualenv python-wheel

我认为这并没有什么不同,但我使用的是Python 2.7。

因此,我的问题的一般部分如下:我为每个项目使用单独的virtualenv。我没有管理员权限,我也不想搞乱系统安装的软件包。当然,我想使用轮子来加速virtualenv的包升级和安装。如何构建一个仅在特定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的{​​{1}}处于活动状态时构建轮子时,将轮子依赖于特定的轮子似乎是一个可怕的想法virtualenv的{​​{1}}版本。

依赖于numpy

pandas似乎安装了numpy自己的组件,但我不确定这是否是最佳解决方案。

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

1 个答案:

答案 0 :(得分:15)

问题描述

  • 有一个python包(如scipy),它依赖于其他包(如numpy),但setup.py未声明该要求/依赖。
  • 为这样的包构建一个轮子将成功,当前环境提供所需的包。
  • 如果所需的包不可用,构建滚轮将失败。

注意:理想的解决方案是通过添加必需的包声明来纠正损坏的setup.py。但这基本上是不可行的,我们必须采取另一种方式。

解决方案:首先安装所需的软件包

程序(用于安装需要scipy的{​​{1}})有两个步骤

  1. 构建轮子
  2. 使用轮子安装所需的包
  3. 用你需要的轮子填充驾驶室

    这只需要进行一次,然后可以多次重复使用。

    1. 已正确配置pip配置,以便允许从轮子安装,设置wheelhouse目录并与numpydownload-cache重叠,如下面的find-links示例所示:< / p>

      pip.conf
    2. 为所有必须编译的软件包安装所有必需的系统库

    3. 为所需的包([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
    4. 设置virtualenv(只需要一次),激活它并安装$ pip wheel numpy

      numpy

      当车轮准备就绪时,应该很快。

    5. $ pip install numpy 构建一个轮子(仍然在virtualenv中)

      scipy

      到现在为止,您的驾驶室将装满您需要的轮子。

    6. 您可以删除临时virtualenv,不再需要它。

    7. 安装到新的virtualenv

      我假设,你已经创建了新的virtualenv,激活它并希望在那里安装$ pip wheel scipy

      直接从新scipy轮安装scipy仍然会因缺少scipy而失败。我们首先安装numpy来克服这个问题。

      numpy

      然后用scipy结束

      $ pip install numpy
      

      我想,这可以在一次通话中完成(但我没有测试)

      $ pip install scipy
      

      反复安装已验证版本的$ pip install numpy scipy

      很可能,在将来的某个时刻,scipyscipy的新版本将被释放,而pip将尝试安装最新版本,而您的驾驶室中没有轮子。

      如果您可以使用目前使用的版本,则应创建numpy,说明您喜欢的版本requirements.txtnumpy并从中安装。

      这将确保在真正使用之前存在所需的包装。