16

我认为这在这里没有什么区别,但我使用的是 Python 2.7。

所以我的问题的一般部分如下:我virtualenv为每个项目使用单独的。我没有管理员权限,也不想弄乱系统安装的软件包。自然,我想使用轮子来加快跨virtualenvs 的包升级和安装。如何构建仅在特定范围内满足依赖关系的轮子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它不是全局存在的,并且当安装了virtualenvwith时构建轮子可以工作numpy,所以让轮子依赖于特定virtualenv版本的numpy.

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

我可以安装numpy--user使用它来制造scipy轮子。有更好的选择吗?

4

1 回答 1

15

问题描述

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

setup.py注意:理想的解决方案是通过添加所需的包声明来纠正损坏。但这大多是不可行的,我们必须另辟蹊径。

解决方法:先安装需要的包

该过程(用于安装scipy需要numpy)有两个步骤

  1. 造轮子
  2. 用轮子安装你需要的包

用您需要的轮子填充驾驶室

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

  1. 已正确配置 pip 配置,以便允许从 wheel 安装,设置 wheelhouse 目录并与和重叠,download-cache如下find-links例所示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
    
  2. 为所有必须编译的包安装所有必需的系统库

  3. 为所需的包构建一个轮子 ( numpy)

    $ pip wheel numpy
    
  4. 设置 virtualenv (只需要一次),激活它并安装在那里numpy

    $ pip install numpy
    

    当一个轮子准备好时,它应该很快。

  5. scipy为(仍在virtualenv中)建造一个轮子

    $ pip wheel scipy
    

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

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

安装到新的 virtualenv

我假设,您已经创建了新的 virtualenv,将其激活并希望scipy安装在那里。

scipy直接从新车轮安装scipy仍然会因丢失而失败numpy。我们通过先安装来克服这个问题numpy

$ pip install numpy

然后用 scipy 结束

$ pip install scipy

我想,这可以在一个电话中完成(但我没有测试它)

$ pip install numpy scipy

反复安装scipy经过验证的版本

很可能在未来的某个时刻,scipynumpy将发布新版本,pip 将尝试安装您的操舵室中没有轮子的最新版本。

如果您可以使用到目前为止使用的版本,您应该创建requirements.txt说明您喜欢的版本numpyscipy从中安装。

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

于 2014-06-22T17:17:36.653 回答