easy_install/pip 或 apt-get

easy_install/pip 或 apt-get

正如 Ubuntu 中所述Rails 维基百科页面建议使用 gems 来管理你的 Rails/Ruby 依赖项。

使用 Django 等 Python 软件包的最佳实践是什么?我应该通过 apt-get 安装它们,还是应该让 easy_install/pip 从 PyPi 获取它们?

答案1

有几种说法:

  1. 使用存储库/PPA,因为它们可以让您保持稳定并及时获得最新的安全修复。

    这基本是正确的。例如,如果您python-django像我一样安装,您将获得安全更新。这很好,因为您只需掌握 apt 的要点,但在推送更新之前仍需进行测试(尽管每次测试都应该没问题)。

    您可能会争辩说,如果您使用了pip,您可能永远不会检查更新。

  2. 使用pip,这样您就可以使用适当的“稳定”版本。

    毫无疑问:存储库落后于现实世界。Django 是 2.0,但 Ubuntu LTS 版本的存储库(许多人坚持将其用作服务器)在 Ubuntu 16.4 lts 上只能获得 1.8 版(使用 Python 2),但仍可获得安全更新。

    pip始终为您提供最新信息。您只需自行更新即可。

  3. 升级使用 repo 的 Python 安装可能是一场噩梦

    当您将 Ubuntu dist-upgrade 升级到下一个版本时,它会升级很多软件包。很多东西都会发生变化。我知道在 Django 中,这意味着您必须小心谨慎地注意代码不兼容、弃用……但这同样适用于所有其他 Python 代码。

    同样的道理也适用于pip,但pip你每次只能做一件事。你知道问题的原因,所以你就知道在哪里可以找到解决办法。

  4. pip+virtualenv让你把所有东西分开

    virtualenv让您拥有可移植的小型 Python 环境。这允许您在同一台机器上同时运行多个不同的 Python 环境。

    显而易见的好处似乎是维护,因为您可以以与管理代码相同的方式管理环境。 甚至可以将环境存储在 VCS 中...您应该记住,拥有十二个不同的virtualenvs 意味着您需要检查和更新十二个环境。


编辑:在对服务器进行一系列糟糕的升级以将其从 Lucid 升级到 Precise 之后,我从混合 Apt+pip(编号 1 和 2)切换到纯 pip+virtualenv(编号 4)。我没有为每个站点设置一个虚拟环境,而是在十几个站点之间共享一个虚拟环境。目前这种方法可行。

我还必须编写一个小脚本来检查使用 pip 安装的软件包的状态。如果有更新,我必须手动应用它们(这很好,因为我在本地虚拟环境中本地测试它们)。这一切仍然比原来更痛苦,但很多从长远来看更好。

答案2

  • 来自存储库的软件包

    当你的应用程序以某种方式特定于 Ubuntu。它们保证您可以在 Ubuntu 机器上安装稳定的版本,它们受到支持,有时比您通过 pip 获得的版本更成熟。如果您部署了一堆 ubuntu 服务器,或者您正在编写 Ubuntu 应用程序,使用这些,如果可用

    它们有时还包含 Ubuntu 特定的修改。

  • pip 与 easy_install

    关于这些,没什么好说的,正如 Django 黑客 James Bennett 所说:

    请看在 Guido 的份上,停止使用 setuptools 和 easy_install,改用 distutils 和 pip。

    有关差异的深入讨论,请参阅关于包装James Bennett (django 的) 和对“包装”的几点修正作者:Ian Bicking (mozilla 的)。

如果你想要安全,请尝试使用以下方式进行 pip 部署虚拟环境。这为您提供了一个独立的 Python 环境,因此您可以确保您的应用程序可以在任何机器上运行。

稍等一下,我相信有些人会不同意我的看法。

相关内容