【问题标题】:How to customize virtualenv shell prompt如何自定义 virtualenv shell 提示符
【发布时间】:2013-12-29 18:05:37
【问题描述】:

如何定义在激活Python virtual environment 时使用的自定义提示?

我有一个 bash 脚本,用于激活我在调用特定 Fabric 命令时使用的 virtualenv。我希望 shell 提示符说出类似“(fab)”的内容,这样我就可以轻松地将它与我打开的其他 shell 区分开来。按照this 的例子,我试过了:

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". .env/bin/activate; PS1='(fab) '; exec /bin/bash -i"

但提示没有变化。我做错了什么?


【问题讨论】:

  • 你是在采购这个脚本还是作为子进程运行?

标签: python bash virtualenv


【解决方案1】:

提示设置在 virtualenv 的激活脚本中(位于 virtualenv 下的 bin 文件夹中)。如果你只是想改变几次提示,你可以在调用activate之前设置一个环境变量(确保在相应的deactivate文件中清除它)。如果您只是希望提示始终不同,您可以在如下所示的行中进行激活

set "PROMPT=(virtualenvname) %PROMPT%"

如果您使用的是 virtualenvwrapper,您也可以在 postactivate 和 postdeactivate 脚本中执行所有这些操作。

【讨论】:

  • 您的说明有点混乱。我只想在从我发布的示例 shell 脚本调用时执行此操作。我将如何将其合并到我的脚本中?像您建议的那样简单地添加PROMPT='(fab)' 是行不通的。
  • 你需要在你的shell脚本中设置一个环境变量,然后修改activate脚本来设置一个不同的提示,如果你的环境变量存在的话。如果您查看激活脚本,已经有部分包含环境变量的 if/else 逻辑。只需确保清除 deactivate 中的变量,否则您将始终遇到 if 情况。
  • @Tom,激活脚本只查找PS1,我已经在定义它了。你指的是什么环境变量?我将如何定义它?
  • 您将在您提到like this 的bash 脚本中设置变量,然后在activate 脚本中查找该变量的存在。
【解决方案2】:

我找不到通过作为子进程执行的脚本来执行此操作的任何方法。调用单独的 bash 进程似乎会忘记任何先前设置的 PS1。但是,如果我只是获取脚本,结果证明是微不足道的:

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
. .env/bin/activate
PS1="(fab) "

【讨论】:

    【解决方案3】:

    看来

    exec /bin/bash -i
    

    正在重置 PS1 变量。当我跑步时

    export PS1="foo "; bash
    

    它也会重置它。奇怪的是,当我查看 bash 源(shell.c 和 variables.c)时,它似乎在使用

    set_if_not ("PS1", primary_prompt);
    

    初始化它。但我不确定这和 main() 之间会发生什么。放弃。

    【讨论】:

      【解决方案4】:

      我也试过 (RedHat CentOS)。我找到了两者的解决方案。

      CYGWIN

      经过一番调查,我发现问题在于 PS1 是由 /etc/bash.bashrc 设置的,它覆盖了 PS1 env.var。所以你需要禁用运行这个文件:

      /bin/bash -c ". .env/bin/activate; PS1='(fab) ' exec /bin/bash -i --norc"
      

      /bin/bash -c ". .env/bin/activate; export PS1='(fab) '; exec /bin/bash -i --norc"
      

      Linux

      它的工作原理要简单得多:

      /bin/bash -c ". .env/bin/activate; PS1='(fab) ' exec /bin/bash -i"
      

      /bin/bash -c ". .env/bin/activate; export PS1='(fab) '; exec /bin/bash -i"
      

      如果您正在调用的脚本没有导出变量(我想它没有)并且设置的变量没有出现在环境中,那么您可以尝试这样的事情:

      /bin/bash -c "PS1='(fab) ' exec /bin/bash --rcfile .env/bin/activate; "
      

      希望能帮到你!

      【讨论】:

      • 这些对我都没有任何作用。最后一个甚至抛出错误“/bin/bash: --: invalid option”
      • Cerin:您使用哪个版本的 bash?在哪个平台上?
      • Ubuntu 12.04 上的 4.2.25
      • @Cerin:对不起!我没有意识到'--rcfile' 不喜欢与短选项混合!删除最后 bash 行中“--rcfile”之前的“-i”。
      • 修复了错误,但仍然不显示自定义 PS1 值。
      猜你喜欢
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多