我需要在Vagrant中使用virtualenv吗?

22

我曾使用VirtualBox手动设置虚拟环境来运行本地Django项目,并在其中使用virtualenv。最近我发现了Vagrant并决定切换到它,因为它看起来非常简单和有用。
但是我无法确定-我是否仍然需要在Vagrant VM中使用virtualenv,它是否被鼓励使用或被禁止使用?


1
如果您在vagrant上使用virtualenv,请注意当virtualenv位于vagrant共享目录中时会出现缓慢的情况。更多信息请参见:https://dev59.com/yXfZa4cB1Zd3GeqPOS_T#27844226 - amwinter
我不知道为什么这么多人回答这个问题时都会说“不要使用virtualenv而是创建可用于virtualenv的包”,创建Python包是一个独立的过程,即使你不在virtualenv中,你仍然可以使用pip install安装包。因此,每个Python软件都应该支持setuptools。 - erikbstack
3个回答

31

正如Devin所述,如果您是机器的唯一用户,则在部署到vagrant机器时不需要使用virtualenv。但是,即使您不在开发或部署中使用它,我仍然建议启用virtualenvsetup.py等。

在我(并不那么)谦虚的意见中,任何Python项目都应该:

  1. 包括一个.cvsignore.gitignore.hgignore等文件,忽略常见的Python中间文件以及virtualenv目录。
  2. 一个requirements.txt文件,以符合pip格式列出所需的软件包。
  3. 包括一个具有以下目标的Makefile

    • environment:使用virtualenvpyvenv创建虚拟环境。
    • requirements:使用piprequirements.txt文件安装所需软件包。
    • develop:在虚拟环境中运行setup.py develop
    • test:运行setup.py test
    • clean:删除中间文件、覆盖报告等。
    • maintainer-clean:删除虚拟环境。

    这个想法是让Makefile尽可能简单。依赖关系应该设置得这样,以便您可以克隆存储库(或提取源代码tarball)并运行make test。它应该创建一个虚拟环境,安装要求,并运行单元测试。

您还可以在Makefile中包含一个Vagrantfile和一个vagrant目标,以运行vagrant up。同时,在maintainer-clean目标中添加vagrant destroy。
这使得您的项目可供任何使用vagrant或不使用vagrant进行开发的人使用。如果(当)您需要在vagrant或物理环境中与另一个项目一起部署时,包括一个干净的setup.py和描述您最小环境的Vagrantfile,就可以简单地安装到虚拟环境或共享的vagrant机器中。

3
可以举一个这样的项目的例子吗? - Bunyk

12
如果您每个项目运行一个vagrant虚拟机,那么没有直接的理由使用virtualenv。
如果其他贡献者不使用vagrant,但使用virtualenv,则您可能希望使用并支持它以使他们的生活更轻松。

每个项目一个Vagrant虚拟机 - 这意味着如果我向其中添加一个box,并在多个项目中使用它,它们将不会使用单独的vdi文件,而是共享相同的操作系统及其上的设置。 - Gill Bates
3
不,你可以使用一个盒子——一个盒子只是一个虚拟机的模板。我只是指如果多个项目使用相同的目录并且该目录是一个 Vagrant 环境,则这些项目之间不会被隔离开来。 - Devin Jeanpierre

9

虚拟环境(Virtualenv)以及其他形式的隔离(Docker、专用VM等),并不一定是互相排斥的。即使在隔离环境下,使用虚拟环境仍然是个好主意,可以保护虚拟系统Python免受项目包的影响。*nix系统使用大量基于Python的工具,这些工具依赖于特定版本的包在系统Python中可用,您不希望干扰它们。

请注意,虚拟环境仍然只能处理纯Python包,并不能解决与系统混合的本机扩展的情况。


1
在走过所选答案的路线并处理奇怪的软件包导入问题之后,我更加欣赏这个答案。浪费了数小时之后,我回到使用虚拟环境; 因此我强烈推荐它。它可以节省您一些心力(除非您是Python / Linux专业人士并且想要处理它)。 - mehmet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接