如何“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
?我目前的做法是:
- 我想安装一个名为
foo
的软件包。
pip install foo
foo
依赖于 Python 包 bar
。
- 如果
bar
构建失败,则查看错误消息和 guess/google 我需要安装哪些非 Python 依赖项。
sudo apt-get install libbaz-dev
sudo pip install bar
- 重复直到
bar
成功。
sudo pip uninstall foo
- 重复整个过程,直到没有错误消息。
第 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 包时的建议。
许多 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
?我目前的做法是:
- 我想安装一个名为
foo
的软件包。 pip install foo
foo
依赖于 Python 包bar
。- 如果
bar
构建失败,则查看错误消息和 guess/google 我需要安装哪些非 Python 依赖项。 sudo apt-get install libbaz-dev
sudo pip install bar
- 重复直到
bar
成功。
- 如果
sudo pip uninstall foo
- 重复整个过程,直到没有错误消息。
第 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 包时的建议。