【问题标题】:Mercurial update hook not activating Python virtual environmentMercurial 更新挂钩未激活 Python 虚拟环境
【发布时间】:2015-11-04 21:30:32
【问题描述】:

我有一个 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 激活的原因

【问题讨论】:

  • 您希望在哪里激活 virtualenv?它只会在似乎没有做任何事情的子shell期间处于活动状态。
  • 嗯,这似乎更棘手。不确定是否有令人满意的解决方案。在我对您的另一个问题的回答中,我不认为 virtualenv 仅对生成它的 shell 是瞬态的。您的 IDE 是否具有允许修改/与其提供的 shell 交互的 API? stackoverflow.com/questions/13122137/… 可能有一些半答案和帮助

标签: python bash mercurial virtualenv


【解决方案1】:

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

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

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

这些都不是使用 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多