Python 如何自定义virtualenv shell提示符

Python 如何自定义virtualenv shell提示符,python,bash,virtualenv,cygwin,linux,Python,Bash,Virtualenv,Cygwin,Linux,如何定义在激活时使用的自定义提示 我有一个bash脚本,用于在调用特定命令时激活virtualenv。我希望shell提示符显示类似“(fab)”的内容,这样我就可以轻松地将其与打开的其他shell区分开来。下面的例子中,我尝试过: #!/bin/bash script_dir=`dirname $0` cd $script_dir /bin/bash -c ". .env/bin/activate; PS1='(fab) '; exec /bin/bash -i" 但是提示没有改变。我做错了

如何定义在激活时使用的自定义提示

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

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". .env/bin/activate; PS1='(fab) '; exec /bin/bash -i"
但是提示没有改变。我做错了什么



提示在virtualenv的激活脚本中设置(位于virtualenv下的bin文件夹中)。如果只想在某些时候更改提示,可以在调用activate之前设置一个环境变量(确保在相应的deactivate文件中清除它)。如果您只是想让提示符始终不同,可以在activate中的以下行中执行此操作

set "PROMPT=(virtualenvname) %PROMPT%"

如果您使用的是VirtualEnvrapper,那么您也可以在postactivate和postdeactivate脚本中完成所有这一切。

我找不到任何方法通过作为子进程执行的脚本来实现这一点。调用一个单独的bash进程似乎忘记了以前设置的所有
PS1
。但是,如果我只是从源代码中获取脚本,那么它就变得微不足道了:

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

exec /bin/bash -i
正在重置PS1变量。当我跑的时候

export PS1="foo "; bash
它也会重置它。奇怪的是,当我查看bash源代码(shell.c和variables.c)时,它似乎使用了

set_if_not ("PS1", primary_prompt);
开始吧。但我不确定这和main()之间会发生什么。放弃。

我试了又试(RedHat CentOS)。我找到了解决这两个问题的办法

CYGWIN

经过一些调查,我发现问题在于PS1是由/etc/bash.bashrc设置的,它覆盖了PS1 env.var。因此,您需要禁用以使用以下命令运行此文件:

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

LINUX

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

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

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

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

我希望我能帮忙

您是在寻找这个脚本还是作为子进程运行?您的说明有点混乱。我只想在从我发布的示例shell脚本调用时执行此操作。我将如何将其纳入我的脚本中?按照您的建议简单地添加
PROMPT='(fab)
是不起作用的。您需要在shell脚本中设置一个环境变量,然后修改激活脚本以设置一个不同的提示(如果您的环境变量存在)。如果查看激活脚本,则已经有一些部分包含环境变量的If/else逻辑。只需确保在deactivate中清除变量,否则您将总是遇到if情况。@Tom,activate脚本只会查找我已经定义的
PS1
。您指的是什么环境变量?我该如何定义它呢?您可以在您提到的bash脚本中设置变量,然后在activate脚本中查找该变量的存在。这些都对我没有任何帮助。最后一个甚至抛出错误“/bin/bash:--:无效选项”Cerin:您使用哪个版本的bash?在哪个平台上?Ubuntu 12上的4.2.25。04@Cerin:对不起!我没有意识到“--rcfile”在某种程度上不喜欢与短选项混合使用!在最后一行
bash
中删除'--rcfile'之前的'-i'。这修复了错误,但仍不显示自定义PS1值。
/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; "