如何“pip install”具有非 Python 依赖项的包?

How to `pip install` a package that has non-Python dependencies?

许多 python 软件包对非 Python 软件包具有构建依赖性。我特别想到 lxml 和 cffi,但这种困境适用于 PyPI 上的很多包。这两个软件包都对非 Python 软件包(如 libxml2-dev、libxslt-dev、zlib1g-dev 和 libffi-dev)具有未公开的构建依赖性。 lxml 和 cffi 的网站声明了其中一些依赖项,但似乎无法从命令行解决这个问题。

因此,SO 上有数百个问题采用这种一般形式:

pip install foo fails with an error: "fatal error: bar.h: No such file or directory". How do I fix it?

这是对 pip 的误用还是 它的工作原理? 有没有一种明智的方法可以在运行之前知道要安装哪些构建依赖项 pip?我目前的做法是:

  1. 我想安装一个名为 foo 的软件包。
  2. pip install foo
  3. foo 依赖于 Python 包 bar
    • 如果 bar 构建失败,则查看错误消息和 guess/google 我需要安装哪些非 Python 依赖项。
    • sudo apt-get install libbaz-dev
    • sudo pip install bar
    • 重复直到 bar 成功。
  4. sudo pip uninstall foo
  5. 重复整个过程,直到没有错误消息。

第 4 步特别烦人。显然 pip(版本 1.5.4)首先安装请求的包,在任何依赖项 之前。因此,如果任何依赖项失败,您不能只要求 pip 重新安装它,因为它认为它已经安装了。也没有仅安装依赖项的选项,因此您必须卸载软件包然后重新安装。

使用pip有没有更智能的流程?

对于大多数流行的软件包,最近的 ubuntu 系统有一个解决方法。比如我要安装matplotlib。当您订购 pip install matplotlib 时,它通常会因为缺少依赖项而失败。

您可以改用apt-get install python-matplotlib。对于 python3,您可以使用 apt-get install python3-matplotlib

这实际上是对建议使用 apt-get 的答案的评论,但我没有足够的声誉点数来留下一个。

如果你经常使用 virtualenv,那么通过 apt-get 安装 python 包会很痛苦,因为当 python在系统范围内安装的软件包和安装在您的 virtualenv 中的 python 软件包尝试相互交互。我发现有帮助的一件事是使用 build-dep 功能。要构建 matplotlib 依赖项,例如:

sudo apt-get build-dep python-matplotlib

然后激活您的虚拟环境并执行 pip install matplotlib。它仍将经历构建过程,但会为您处理许多依赖项。

这是 cran repositories 在 ubuntu 中安装 R 包时的建议。