easy_install/pip 或者 apt-get

如在Ubuntu上的Rails维基页面中所指出,建议使用gems来管理您的Rails/Ruby依赖项。
对于Python包(如Django),最佳实践是什么?我应该通过apt-get安装它们,还是让easy_install/pip从PyPi获取它们?
2个回答

有几个论点:
使用存储库/PPA,因为它们将使您保持稳定并及时更新安全修复程序。
这基本上是正确的。例如,如果您像我一样安装了python-django,您将获得安全更新。这很好,因为您只需跟上apt的步伐,但在推送更新之前仍然需要测试事物(尽管每次测试都应该没问题)。
您可以争论说,如果您使用pip,您可能永远不会检查更新。
使用pip,以便您可以使用适当的“稳定”版本。
毫无疑问:存储库落后于现实世界。Django是2.0版本,但对于LTS版本的Ubuntu(许多人坚持使用服务器),您在Ubuntu 16.4 lts上只能获得1.8版本,但仍然可以获得安全更新。 pip始终提供最新版本。您只需自己更新它们。
升级使用存储库的Python安装可能会成为一场噩梦
当您将Ubuntu升级到下一个版本时,它会升级许多软件包。许多事情会发生变化。我知道在Django中,这意味着您必须小心注意代码不兼容性、弃用等问题...但对所有其他Python代码也适用。
对于pip也是如此,但是使用pip,您可以一次只做一件事。您知道是什么导致了问题,因此您知道在哪里寻找解决方法。 pip+virtualenv使您可以保持分离
virtualenv允许您拥有便携式的小型Python环境。这使您可以在同一台机器上同时运行多个不同的Python环境。
显而易见的好处似乎是维护方面,因为您可以像管理代码一样管理环境。甚至将环境存储在版本控制系统中...但是您应该记住,拥有十二个不同的虚拟环境意味着您需要检查和更新十二个环境。
编辑:在将服务器从Lucid升级到Precise的一系列可怕的升级之后,我已经从混合使用Apt+pip(第1和第2)切换到了纯粹的pip+virtualenv(第4)的情况。与其每个站点都有一个虚拟环境,我现在有一个共享的虚拟环境用于十几个站点。目前这种方式还能正常工作。
我还不得不编写一个小脚本来检查使用pip安装的软件包的状态。如果有更新,我必须手动应用它们(这很好,因为我会在本地的虚拟环境中进行测试)。总体而言,这一切仍然比起最初来说有些痛苦,但从长远来看要好得多。

  • 从软件库中获得的软件包

    每当您的应用程序在某种程度上与Ubuntu有关时,应安装这些软件包。它们确保您可以在Ubuntu机器上安装稳定版本,受到支持,有时比通过pip获取的版本更成熟。如果您部署了一堆Ubuntu服务器,或者正在编写一个Ubuntu应用程序,请使用这些软件包(如果可用)。

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

  • pip与easy_install

    关于这两者,就像Django开发者James Bennett所说:

    请,出于对Guido的爱,请停止使用setuptools和easy_install,改用distutils和pip。

    有关详细讨论,请参阅James Bennett(django的开发者)的在打包方面和Ian Bicking(mozilla的开发者)的对“在打包方面”的一些修正

如果你想要安全起见,试着使用virtualenv来进行pip部署。这样可以给你一个隔离的Python环境,确保你的应用程序能在任何机器上运行。
不过稍等一下,我相信有些人会不同意我的观点。