Mercurial 更新挂钩未激活 Python 虚拟环境

Mercurial update hook not activating Python virtual environment

我有一个 bash 脚本,我试图在 hg update 发生时随时执行该脚本。这个 bash 脚本的目标是切换到正确的 virtualenv。为了简单起见,这个脚本叫做.test——如下所示:

#!/bin/bash
echo 'testing hg update hook'
source ~/.virtualenvs/myvirtualenv/bin/activate

每当我使用 source .test 从我的 shell 调用此脚本时,一切正常;我可以看到 echo 的结果和我的 shell 变化以反映激活的 virtualenv

然而,当我执行 hg update 时,virtualenv 没有被激活。脚本正在触发,因为我可以看到回显结果;然而,我的 shell 没有更新以反映激活的 virtualenv。下面是我的 .hg/hgrc 文件中的挂钩设置。为什么我的 virtualenv 没有在此挂钩中被激活有什么想法吗?

[hooks]
# Update to the correct virtualenv when switching branches (hg update branchname)
update = source .test

更新 1: 根据这个 answer,我不相信 hg update 钩子在我当前的 shell 中触发;这就是为什么当我手动 运行 脚本时 virtualenv 激活但从钩子

失败

您的问题是,当您调用 shell 脚本时,对环境变量的任何更改都不会导出到调用 shell(因此您需要调用 source activate来自周围shell).

好消息是您并不严格需要调用activate来访问虚拟环境。 activate 会做的是:

  1. 将 virtualenv 的 bin 目录添加到 $PATH
  2. 设置 VIRTUAL_ENV 环境变量。
  3. 修改提示。

None 是使用 virtualenv 所必需的,你可以在 virtualenv 中执行 python 二进制文件,而无需使用脚本;该提示可能与您的用例无关,您可以通过符号链接将目录(或 python 可执行文件)添加到您的路径,并且您只需要 VIRTUAL_ENV 环境变量用于软件出于某种原因需要了解它所在的 virtualenv 运行。如有必要,您可以从 sys.executable 中找出答案。例如:

import sys, os

def find_venv():
  python = sys.executable
  for i in xrange(10):
    if not os.path.islink(python):
      break
    python = os.path.realpath(python)
  return os.path.dirname(os.path.dirname(python))

if not os.environ.has_key("VIRTUAL_ENV"):
  os.environ["VIRTUAL_ENV"] = find_venv()