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

Mid*_*ter 15 python pip virtualenv scipy python-wheel

我认为它没有区别,但我使用的是Python 2.7.

所以我的问题的一般部分如下:我virtualenv为每个项目使用一个单独的.我没有管理员权限,我也不想乱用系统安装的软件包.当然,我想使用轮子加速整个包的升级和安装virtualenv.如何构建一个仅在特定范围内满足依赖性的轮子virtualenv

具体来说,发行

pip wheel -w $WHEELHOUSE scipy
Run Code Online (Sandbox Code Playgroud)

失败了

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...
Run Code Online (Sandbox Code Playgroud)

因为numpy不存在全局和在构建轮,当工作virtualenvnumpy安装的是积极的,这似乎是一个可怕的想法有车轮依赖于特定virtualenv的的版本numpy.

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

我可以安装numpy使用--user,并用它来建立scipy轮.有更好的选择吗?

Jan*_*sky 15

问题描述

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

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

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

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

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

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

这必须只进行一次,然后可以多次重复使用.

  1. 已正确地配置PIP配置,以便从车轮该安装是允许的,操舵室目录被设置和使用重叠download-cachefind-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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为所有必须编译的包安装所有必需的系统库

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

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

    $ pip install numpy
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. 建立一个轮子scipy(仍然在virtualenv)

    $ pip wheel scipy
    
    Run Code Online (Sandbox Code Playgroud)

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

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

安装到新鲜的virtualenv

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

直接scipy从新scipy车轮安装仍然会失败numpy.这是我们numpy首先安装克服的.

$ pip install numpy
Run Code Online (Sandbox Code Playgroud)

然后用scipy完成

$ pip install scipy
Run Code Online (Sandbox Code Playgroud)

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

$ pip install numpy scipy
Run Code Online (Sandbox Code Playgroud)

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

很可能,在未来的某个时刻,新版本scipynumpy将要发布的版本和pip将尝试安装最新版本,而您的驾驶室中没有轮子.

如果你可以用到目前为止你已经使用了版本的生活,你必须创建requirements.txt陈述的版本,numpyscipy你喜欢的,并从它安装.

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