Mercurial update hook不激活Python虚拟环境

时间:2015-11-04 21:30:33

标签: python bash mercurial virtualenv

我有一个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在我手动运行脚本但是从钩子

失败时激活的原因

1 个答案:

答案 0 :(得分:1)

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

好消息是,您没有严格需要来呼叫activate才能访问虚拟环境。 activate将要做的是:

  1. 将virtualenv的bin目录添加到$PATH
  2. 设置VIRTUAL_ENV环境变量。
  3. 修改提示。
  4. 为了使用virtualenv,这些都不是必需的,你可以在不使用脚本的情况下在virtualenv中执行python二进制文件;提示可能与您的用例无关,您可以通过符号链接将目录(或仅python可执行文件)添加到您的路径中,并且您只需要VIRTUAL_ENV环境变量用于某些原因需要了解它正在运行的虚拟现实。如果有必要,你可以从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()