我有一个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在我手动运行脚本但是从钩子
答案 0 :(得分:1)
您的问题是,当您调用shell脚本时,对环境变量的任何更改都不会导出到调用shell(因此您需要从周围的shell调用source activate
)。
好消息是,您没有严格需要来呼叫activate
才能访问虚拟环境。 activate
将要做的是:
bin
目录添加到$PATH
。VIRTUAL_ENV
环境变量。为了使用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()