在创建Python虚拟环境中,“virtualenv”和“-m venv”有什么区别?

101

如果我听起来有点傻,请原谅。 我对此感到困惑: 这两者之间有什么区别:

virtualenv myvenv

并且

-m venv myvenv

第一种方法可以很好地帮我创建虚拟环境,而另一种方法则不行。
我使用命令cd进入我的开发目录,然后使用virtualenv myvenv来创建虚拟环境。这样可以成功创建虚拟环境。但如果我使用-m venv myvenv命令,则会出现错误。

6
要使它起作用,您需要使用“ python -m venv myvenv ”,其中“ python -m ”将“ venv ”模块作为脚本调用,并将“ myvenv ”作为参数传递给该脚本。 - juanpa.arrivillaga
1
这个问题有误导性,因为它被呈现得好像是关于两个命令之间的区别,但是楼主似乎实际上是在询问为什么第二个版本-m venv myvenv完全不起作用。它完全不起作用的原因是因为它不是一个有效的命令;正确的应该是python -m venv myvenv - Karl Knechtel
但是如果我使用-m venv myvenv,它只会出现错误。这是一个教科书般的例子,说明缺乏调试细节的问题应该立即关闭。"什么错误?"会立即消除困惑。相反,我们得到了一个提问不清楚的版本,这个“经典”的问题(虽然还不够好;“有什么区别”通常是两个小问题穿着一件大衣)。 - Karl Knechtel
实际上,即使忽略这一点,它也不会成为“有什么区别”的问题的权威回答;我们已经有了venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenv等之间有什么区别?这个问题的解答。 - Karl Knechtel
2个回答

98
venv是直接随Python 3一起提供的软件包。所以你不需要通过pip install安装任何东西。
virtualenv则是一个独立的库,可以在https://virtualenv.pypa.io/en/stable/上获得,并且可以使用pip进行安装。
它们解决了同样的问题,并且工作方式非常相似。
如果你使用的是Python 3,我建议避免使用任何“额外”的依赖项,只需使用venv即可。
你遇到的错误可能是因为你使用的是Python 2/pip2。

谢谢您。如果我删除当前的Python安装并在我的电脑上重新安装Python 3.5,这会解决这个问题吗? - Prince Kwekowe
是的,可能可以,但如果您给我具体的错误信息,我可以更准确地告诉您。不过,如果您更喜欢使用Python2,您可以使用virtualenv,它与venv基本相同。 - Costantin
1
谢谢。在“-m venv”之前我漏掉了“python”。现在我明白了区别。 - Prince Kwekowe

58

我认为virtualenv文档阐述得最清楚明白:

venv是Python 3.3以后集成到标准库中的virtualenv的一个子集,指的是只有virtualenv部分功能被包含在venv中:

  • venv可能会更慢,因为它没有"app-data种子方法"。请在文档中了解有关virtualenv Seeders的更多信息。
  • venv只能通过升级Python版本来更新,而virtualenv则可以使用pip进行更新。
  • venv不可扩展。
  • virtualenv具有更丰富的编程API(描述虚拟环境而无需创建它们)。请在此处查看venv API
  • venv 无法自动发现任意安装的 Python 版本,而 virtualenv 可以。这意味着,如果你想使用 PATH 中除第一个 Python 版本之外的其他版本,你必须在 venv 中指定完整路径的 python 可执行文件。而在 virtualenv 中,你只需要给出版本号即可。请参见虚拟环境文档中的 Python 发现
  • 对我来说,它们之间的差异相当微妙,并且唯一实际的区别是 venv 包含在标准库中(自 3.3 版本开始)。我长期以来一直使用 python -m venv venv,从未需要其他替代方法。


    3
    最后一部分似乎不太合适?如果我有x个Python版本,我仍然可以直接调用其中任何一个Python并获取该特定解释器的正确运行时路径。因此,使用那个随机Python创建一个"venv"只需要我知道那个Python的位置,例如~/localcopies/python/3.7.7/python -mvenv myproject - rasjani
    3
    是的,我同意。virtualenv文档中有些地方表述有误导性。区别在于自动发现Python版本。我已经编辑了答案。 - Niko Pasanen
    1
    我认为venv不仅仅是有时候慢,而是一直慢。你提供的文档(谢谢!)中说速度慢的范围从10倍到10,000倍不等。听起来这个差距并不是很"微妙"。在Linux上,我也有同样的经历。在gitlab中,virtualenv为我们节省了大量的CI-CD流水线时间。 - undefined

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