为缺少依赖关系声明的包(如scipy)构建轮子

2024-04-25 05:27:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,我的问题的一般部分如下:我对每个项目使用单独的virtualenv。我没有管理员权限,也不想破坏系统安装的软件包。当然,我想使用wheel s来加速跨virtualenvs的包升级和安装。如何构建一个只在特定的virtualenv中满足依赖关系的wheel?

具体来说,发行

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不是全局存在的,并且当安装了numpyvirtualenv处于活动状态时,在构建轮子时,让轮子依赖于特定的virtualenv版本的numpy似乎是一个可怕的想法。

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

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


Tags: pippybuildnumpyhomeforbasevirtualenv
1条回答
网友
1楼 · 发布于 2024-04-25 05:27:37

问题描述

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

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

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

这个过程(用于安装需要scipynumpy)有两个步骤

  1. 制造轮子
  2. 使用控制盘安装所需的软件包

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

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

  1. 已正确配置pip配置,以便允许从wheels进行安装,已设置wheelhouse目录并与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
    
  2. 为所有必须编译的软件包安装所有必需的系统库

  3. 为所需的包(numpy)生成一个轮子

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

    $ pip install numpy
    

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

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

    $ pip wheel scipy
    

    到现在为止,你的驾驶室会装上你需要的轮子。

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

安装到fresh virtualenv中

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

直接从新的scipy控制盘安装scipy仍然会在缺少numpy时失败。我们先安装numpy来克服这个问题。

$ pip install numpy

然后用scipy结束

$ pip install scipy

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

$ pip install numpy scipy

重复安装已验证版本的scipy

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

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

这将确保所需的包装在实际使用之前就已存在。

相关问题 更多 >