Python venv和virtualenvwrapper结合使用

24

在Python 3.5及以上版本中,创建虚拟环境的推荐方式是使用venv而不是virtualenv。尽管如此,python打包教程中介绍了这两个工具。

virtualenvwrapper是一个建议在使用virtualenv时使用的包装工具。

我的问题是:

  1. 是否有一种方法可以在venv中使用virtualenvwrapper?
  2. 或者由于使用venv,甚至可以考虑不需要virtualenvwrapper吗?(我无法想象这是真的,因为它是解决另一个问题的包装器)

编辑: 我可以看到回答我的问题有些混乱。如上面的链接所述,venv是Python官方等效于virtualenv的技术。多个Stack Overflow问题建议使用venv。正如所提出的“重复”中提到的:

venv的引入部分是对那种混乱的回应。如果你想帮助改善这种情况,我建议你使用venv并鼓励其他人也这样做

因此建议使用venv。但是,如此问题所示,如果要使用venv,如何使用类似virtualenvwrapper的包装器?


@JBentley,你的假设完全正确。我以为我表达得很清楚,但看来不是这样。很高兴有人理解了 :) 我还要补充一点,随着pipenv的引入,这个问题已经不那么重要了。 - user1853417
@user1853417,你能解释一下你的使用情况和工作流程吗?我很好奇为什么在你的情况下pipenv相当于venv+virtualenvwrapper。这些工具,pipenv与venv/virtualenv+wrapper,解决了两个非常不同的问题。 - SwimBikeRun
3个回答

10
这里提供一种个性化而仍然清晰明了的解决方案。将此脚本附加到.bashrc / .bash_profile / .zshrc中,它将为您提供venv的基本管理。
此外,您可以通过添加以下行来扩展脚本,以便它还会显示现有的venv列表。
lsvenv(){
    ls $VENV_HOME
}

不回答问题。可以说仍然是有用的信息。也许可以作为评论发布,或者将其扩展为完整的答案并将其作为替代解决方案留下? - JBentley
1
我目前正在使用这个脚本,它对于管理虚拟环境非常有帮助。尽管我得到了两个反对票,但我还是会把它留在这里,以防它能够帮助其他人... - Memin

8
  1. 有没有办法在venv中使用virtualenvwrapper?

有。只需将 WORKON_HOME 指向您的 venvs 目录即可。以下是我在 ~/.zshrc 中的做法,我同时使用 virtualenv (现在很少用,只用于一些遗留 py2 需求)和 venv (最常见)。我将默认名称更改为 .venvs ,以明确这些主要是 Python 3 venv ,而不是 virtualenv。

# Python Environment Handling
export WORKON_HOME=$HOME/.venvs  # Default name changed from virtualenv to highlight I am using python3 -m venv (aka pyvenv)
export PROJECT_HOME=$HOME/dev
source /usr/local/bin/virtualenvwrapper.sh  # symlinked to /Library/Frameworks/Python.framework/Versions/3.7/bin/virtualenvwrapper.sh
  1. virtualenvwrapper 是不是因为 venv 的出现而不再需要了?(我认为这不可能是真的,因为 virtualenvwrapper 是解决另一个问题的包装器)

venv 等于 virtualenv(简称)。venv 不能替代 virtualenvwrapper,原因与 virtualenv 能替代它的原因相同。你的猜想是正确的。

  1. 这比只创建一个源激活别名更好在哪里?

嗯,这取决于你的需求,但我发现带有 Zsh 插件 virtualenv 和 virtualenvwrapper 的 virtualenvwrapper 非常棒,比裸的别名要好。

workon 列出所有虚拟环境非常方便,然后 workon speech_analyzer 就可以直接进入它了。

  1. 其他的解决方案?

你也可以设置钩子,在目录更改时激活虚拟环境,但如果这就是你想要的,并且只有这些,那么它本质上就是 pipenv。如果只需要这个功能,pipenv 很棒。Pipenv 还具有有趣而有前途的锁定文件功能,但它太慢了用在开发中,而且在生产中存在问题,目前还不能评论。

但我从来不喜欢每个项目一个环境的工作流程,原因在这里给出:https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/。特别是这些需求与我的多项目单个环境的需求相符:https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/#nikola

我在我的电脑上有六个环境和大约 20 个项目。Pipenv 对于这种情况并不适用。Pipenv 坚持为 20 个项目创建 20 个环境。它根本行不通,并且会带来更多的问题。如果你当前确实有一个 1:1 的工作流程,那么 pipenv 可能是你想要的工具。一个注意事项是,很遗憾,你只能在 pipenv 中使用这个工作流程。


0

[编辑,2019年7月8日:读者可能会发现this answer提供了更全面的描述,介绍了处理Python虚拟环境的不同工具。它们都有各自的问题,conda也是如此,它有一个更为复杂的“环境”概念。]

  1. 正如其名称所示,virtualenvwrapper专门设计用于包装依赖于它的virtualenv。我不认为有人已经类似地包装了venv

  2. venv旨在完成创建虚拟环境的基本工作,但环境管理必须通过脚本来完成。尽管shell脚本通常是人们的首选,但venv模块有广泛的API可帮助您完成这些任务。

现在有许多选项可用于创建Python虚拟环境。除了您提到的那些,anaconda允许创建和管理环境,并且大多数情况下与pip非常兼容。

虚拟环境空间中的工具设计为尽可能与标准 Python 分发工具协同工作。但是,Python 3.5 中引入 venv 并没有使 virtualenv 和 virtualenvwrapper 失效,它们都应该仍然可以正常工作。

venv 模块主要是一个简单的工具包,允许程序内创建虚拟环境,它并不打算取代 virtualenvwrapper 的便利性。它只是满足一个相当不同的需求集。


事实上,这个问题提供了更完整的问题描述。链接 - holdenweb
3
相比另一个答案,我更不愿意对这个答案进行负评,因为它更接近问题的关键点,但是它需要改进以更全面地回答问题。从这个答案中并不清楚 virtualenvwrapper 是否可以包装 venv,这应该是提问者关注的主要问题(参见他的第一个问题)。换句话说,这是在 (1) 使用 virtualenvwrapper + virtualenv;还是 (2) 使用 venv(不使用 virtualenvwrapper)之间做出二元选择?还是有选项 (3) 使用 virtualenvwrapper + venv - JBentley
1
@JBentley,你的假设完全正确。我以为我表达得很清楚,但看来不是这样。很高兴有人理解了 :) 我还要补充一点,随着pipenv的引入,这个问题已经不那么重要了。 - user1853417
pipenv使用virtualenv来实现其目的。所以我认为virtualenvwrapper + venv的问题仍然存在。但从virtualenvwrapper的文档和存储库来看,我不认为这是个问题。 - meyj
@user1853417 pipenv非常糟糕,过度营销,并且解决不了venv和virtualenv所解决的任何问题。不要像许多人那样将其推广为替代品。它只做一件事情,部署依赖管理,即使如此,它也做得很差。我希望Python社区能够标准化这些东西并改善可怕的打包实践,但在那之前,pipenv不是答案。使用venv或virtualenv进行开发,使用conda / docker进行部署,使用pyinstaller进行发布。 https://chriswarrick.com/blog/2018/07/17/pipenv-promises-a-lot-delivers-very-little/ - SwimBikeRun

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