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
会做的是:
- 将 virtualenv 的
bin
目录添加到 $PATH
。
- 设置
VIRTUAL_ENV
环境变量。
- 修改提示。
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()
我有一个 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
会做的是:
- 将 virtualenv 的
bin
目录添加到$PATH
。 - 设置
VIRTUAL_ENV
环境变量。 - 修改提示。
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()