如何自定义virtualenv shell提示符

时间:2013-12-11 16:33:57

标签: python bash virtualenv

如何定义激活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"

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


4 个答案:

答案 0 :(得分:2)

提示符在virtualenv的激活脚本中设置(位于virtualenv下的bin文件夹中)。如果您只想稍微更改提示,可以在调用activate之前设置环境变量(确保在相应的deactivate文件中清除它)。如果您只是希望提示始终不同,您可以在激活处看起来像

一样。
set "PROMPT=(virtualenvname) %PROMPT%"

如果你正在使用virtualenvwrapper,你也可以在postactivate和postdeactivate脚本中完成所有这些。

答案 1 :(得分:0)

我无法通过作为子进程执行的脚本找到任何方法。调用单独的bash进程似乎忘记了先前设置的任何PS1。但是,如果我只是采购脚本,那么结果是微不足道的:

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

答案 2 :(得分:0)

出现

exec /bin/bash -i

正在重置PS1变量。我跑的时候

export PS1="foo "; bash

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

set_if_not ("PS1", primary_prompt);

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

答案 3 :(得分:0)

我也尝试了(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; "

我希望我能帮忙!