如何`pip install`一个包含非Python依赖项的包?

时间:2015-01-01 19:44:52

标签: python pip

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

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

  

pip install foo失败并显示错误:"致命错误:bar.h:没有此类文件或目录"。我该如何解决?

这是对pip的误用还是它是如何工作的?在运行pip之前,是否有一种明智的方式来了解要安装的构建依赖项?我目前的做法是:

  1. 我想安装一个名为foo的包。
  2. pip install foo
  3. foo依赖于Python包bar
    • 如果bar版本失败,请查看错误消息并猜测/ google我需要安装的非Python依赖项。
    • sudo apt-get install libbaz-dev
    • sudo pip install bar
    • 重复直到bar成功。
  4. sudo pip uninstall foo
  5. 重复整个过程,直到没有错误消息。
  6. 步骤#4特别烦人。显然pip(版本1.5.4)首先安装所请求的包,然后在任何依赖之前安装。因此,如果任何依赖项失败,您只能让pip再次安装它,因为它认为它已经安装。还没有选择只安装依赖项,因此您必须卸载该软件包然后重新安装它。

    使用pip是否有更智能的流程?

2 个答案:

答案 0 :(得分:14)

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

如果你经常使用virtualenv,那么通过apt-get安装python-packages会变得很麻烦,因为当系统安装了python包并安装了python包时,你可能会遇到神秘的错误在你的virtualenv尝试互相交流。我发现的一件事情确实有用,就是使用build-dep功能。要构建matplotlib依赖项,例如:

sudo apt-get build-dep python-matplotlib

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

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

答案 1 :(得分:1)

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

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