安装pip和virtualenv,一只鸡和鸡蛋两难?

时间:2012-05-09 14:58:19

标签: python installation virtualenv pip

我已经使用了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还是不支持

我看到了思考的主要原因,但可能还有其他人

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

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

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

  

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

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

否则,哪一个应该先行,是否真的有所作为呢?

相关:

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

但是我觉得这完全没有回答我的问题:系统范围与本地问题,但也应该pip或virtualenv先行(并且为什么他们将每一个发送到另一个开始!!!)

3 个答案:

答案 0 :(得分:6)

tl; dr答案首先是VirtualEnv。 对于Python版本2.x和3.x

,每个都可以有两个

[编辑]

我真的很怀疑是否安装(没有安装,你只需下载并执行脚本)VirtualEnv系统范围/每用户甚至是重要的。使用VirtualEnv的重点是创建独立的开发沙箱,以便一个项目中的库不会相互冲突。例如,您可以使用Beautiful-soup Version< 4.x和一个Python 3.x项目在两个不同的虚拟环境中使用Beautiful-soup Version 4.0。

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

答案 1 :(得分:1)

一半,六打另一半。 (让我沉入其中。哈哈。)

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

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

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

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

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

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

答案 2 :(得分:1)

尚未确定最终解决方案,但现在正在发生的事情部分基于@nutjob的评论(不,我暂时还没有切换到buildout,但我稍后会花一些时间来做它!)

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

这些要求规定了以下内容,但略有不同的设置可能会使它与众不同。

  1. 我基于代码/功能的相似性,在逻辑上将这些应用程序组织在一起;每个群集可能都有相同版本的常见python库(pylibmc,枕头等)
  2. 我创建了一些用户,每个群集一个
  3. 对于每个用户,我通过下载virtualenv.py并运行python virtualenv.py VIRTUALENVNAME来安装virtualenv(与用户同名,供我自己选择);我没有安装virtualenv wrapper
  4. 我编辑该用户.bashrc以便立即加载virtualenv
  5. 我用pip安装了通用软件包,但是通过sys.path直接添加了更具体的软件包 这使我可以更快地进行部署,因为文件夹/版本控制项目结构可以承载所有大多数所需的库。 我发现这更清晰,部署更快,更容易编辑。您个人案件的里程可能会有所不同。
  6. 这意味着每个用户都拥有自己的,单一的virtualenv。

    如果我从头开始,我可能会转移到一个扩建或类似的解决方案(我不喜欢混合主管和virtualenv时会发生什么),但我现在对这个很满意。