【问题标题】:Install pip and virtualenv, a chicken and the egg dilemma?安装 pip 和 virtualenv,鸡和蛋的困境?
【发布时间】:2012-05-18 02:55:22
【问题描述】:

我已经在使用 pip 和 virtualenv(实际上有时仍然更喜欢通过 SVN 存储库进行组织良好的组合,明智地使用 svn:externals 和动态 sys.path)。

但是这次对于新的服务器安装,我想以正确的方式做事。

所以我去了pip installation page,它说:

推荐使用 pip 的方法是在 virtualenv 中,因为每个 virtualenv 都自动安装了 pip。这不需要 root 访问权限或修改您的系统 Python 安装。 [...]

然后我去virtualenv installation page 它建议:

您可以使用 pip install virtualenv 安装 virtualenv,或者使用 pip install virtualenv==dev 安装最新的开发版本。您也可以使用 easy_install [...]

当然,pip 应该取代 easy_install :)

当然,它们都解释了所有替代的安装方式。

但是... 应该先走哪一个? 以及我是否应该支持系统范围的点子

我看到一个需要思考的主要原因,但可能还有其他原因

  • 我是否想为该盒子的所有用户提供便利,或者这是一个针对单个用户运行某些服务的服务器?

如果我希望每个人都有一个可用的虚拟环境,我可能只安装一个系统范围的 pip(例如,使用 ubuntu 执行 sudo aptitude install python-pip 然后使用它来安装 virtualenv sudo pip install virtualenv)。

编辑另一个值得思考的理由:virtualenvwrapper 安装说明(但不是docs)说:

注意要使用 virtualenvwrapper,您必须单独安装 virtualenv。

不完全确定“单独”是什么意思(我从未注意到)。

否则,应该先走哪一个,这真的有影响吗?

相关:

最接近的问题(和答案)是以下第一个(特别是参见@elarson 答案),第二个看起来过于复杂:

但我觉得这一切都无法完整回答我的问题:系统范围与本地,但 pip 或 virtualenv 也应该先行(以及为什么他们将彼此发送到另一个开始!!!)

【问题讨论】:

    标签: python installation virtualenv pip


    【解决方案1】:

    一半一个,六打另一个。 (让它沉入水中。哈哈。)

    但更严重的是,您的系统上真的有多个用户吗?如今,即使是 Linux 主机也倾向于为单个用户服务,并且在有多个用户 ID 的情况下,它们往往是在各种隔离用户 ID 下运行多个进程的服务器。鉴于此,让所有用户的生活更轻松并不是那么重要。

    另一方面,每个使用 Python 的多个服务可能有相互冲突的要求,这种情况很少见,因为它可能会归结为所需的 pip 版本。鉴于此,我倾向于全局安装 virtualenv,以便进行 Python 的原始准安装。

    但我想指出另一个想法:Buildout,http://www.buildout.org/

    Buildout 与 virtualenv 做同样的事情,但采用了截然不同的方法。您编写一个构建配置文件 (buidout.cfg),列出您的各种鸡蛋是什么以及它们将如何连接,并指定设置特殊情况的“构建配方”设置(如 Django 部署、Buildbot 服务器、 Plone 网站、Google 应用引擎应用等)。

    然后您使用您的系统 Python 来引导构建,运行它,它会生成一个独立的设置 - 就像一个 virtualenv。

    但最好的部分是:它是可重复的。您可以将相同的buildout.cfg 带到另一台主机并获得相同的设置。使用 virtualenv 实现这一点要困难得多

    【讨论】:

    • 感谢 nutjob,它会做出美味的鸡肉煎蛋卷!说真的,我在服务器上确实有几个帐户(不是生产环境,而是测试环境!) - 许多开发人员去那里玩以了解问题所在。但是您的观点非常公平,确实我应该支持运行我的 python 服务的一个用户。我也会认真研究一下构建——我以前听说过,但从来没有花时间在上面。
    【解决方案2】:

    tl;dr 答案首先是 VirtualEnv。 对于 Python 版本 2.x 和 3.x,您可以分别拥有两个

    [编辑]

    我真的怀疑安装(没有安装,您只需下载并执行脚本)VirtualEnv 系统范围/每个用户是否重要。使用 VirtualEnv 的全部意义在于创建隔离的开发沙箱,这样一个项目中的库就不会相互冲突。例如,您可以在两个不同的虚拟环境中使用 Beautiful-soup 版本

    如何在系统上获取 VirtualEnv 脚本并不重要,因为一旦你拥有它并且 pip 是自包含在 VirtualEnv 中的,那么首先获取 VirtualEnv 就很有意义。同样,一旦您使用 python,您将拥有许多项目,并且对于每个项目,推荐的方法是拥有一个虚拟环境,然后通过 pip 安装依赖项。您可以稍后执行“pip freeze > requirements.txt”,然后执行“pip install requirements.txt”,以简单地跨两个系统复制您的确切库[比如开发和生产]等等......

    【讨论】:

    • 谢谢 subiet,你的回答有什么论据吗?您是否会在每个用户帐户或系统范围内安装 virtualenv,例如。 sudo apt-get install python-virtualenv
    • 编辑了答案以回答您的评论。现在我想知道词性标注器解析这条评论的第一句话的准确度。
    • 有一次不同,尽管可能并不总是很重要,如果 virtualenv 是系统范围的(例如 sudo pip install),每个用户都有它,但版本相同;如果它是自行安装的,则需要一些用户干预,但每个用户都可以使用不同的版本(这不一定是个好主意?)。我自己也一直想知道tl;dr :)
    【解决方案3】:

    尚未决定最终的解决方案,但这就是现在正在发生的事情,部分基于@nutjob cmets(不,我暂时没有切换到构建,但我稍后会花一些时间!)

    我有一个大而强大的服务器,里面有很多 django 应用程序。 我主要使用 gunicorn + supervisord。

    这些要求规定了以下内容,但稍有不同的设置可能会有所不同。

    1. 我根据代码/功能的相似性将这些应用程序逻辑地组织在集群中;每个集群可能会有相同版本的常用 python 库(pylibmc、pillow 等)
    2. 我创建了几个用户,每个集群一个用户
    3. 我通过下载 virtualenv.py 并运行 python virtualenv.py VIRTUALENVNAME 为每个用户安装一个 virtualenv(与用户同名,我自己选择);我没有安装 virtualenv 包装器
    4. 我编辑该用户 .bashrc 以便立即加载 virtualenv
    5. 我用pip安装常用包,但更具体的包直接通过sys.path添加 这让我的部署速度更快,因为文件夹/版本控制项目结构在那里承载了所有大多数必需的库。 我发现这更清晰,部署更快,更容易编辑。您的个人案例的里程数可能会有所不同。

    这意味着每个用户都有自己的单个虚拟环境。

    如果我从头开始,我可能会转向构建或类似的解决方案(我不喜欢混合使用 supervisor 和 virtualenv 时会发生什么),但我现在对这个很满意.. .

    【讨论】:

    • 我会再等几天,希望得到一些关于这个答案的反馈,然后再选择接受的答案!
    猜你喜欢
    • 2017-05-29
    • 2017-03-08
    • 1970-01-01
    • 2015-03-13
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多