如何自定义virtualenv的shell提示符

7
如何定义一个自定义提示符在激活Python虚拟环境时使用?
我有一个bash脚本用于激活virtualenv,当调用特定的Fabric命令时使用它。我希望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"

但是提示没有改变。我做错了什么吗?

你是在引用这个脚本还是作为子进程运行的? - Arovit
4个回答

5

提示符设置在virtualenv的激活脚本中(位于virtualenv下的bin文件夹中)。如果您只想有时更改提示符,可以在调用激活之前设置环境变量(确保在相应的停用文件中清除它)。如果您希望提示符一直不同,您可以直接在activate文件中更改该行:

set "PROMPT=(virtualenvname) %PROMPT%"

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

你的指示有点令人困惑。我只想在从我发布的示例shell脚本中调用时执行此操作。我该如何将其合并到我的脚本中?像你建议的那样简单地添加 PROMPT='(fab)' 并不起作用。 - Cerin
您需要在shell脚本中设置一个环境变量,然后修改激活脚本以设置不同的提示,如果您的环境变量存在。如果您查看激活脚本,已经有了if/else逻辑用于环境变量。只需确保在停用时清除变量,否则您将始终命中if情况。 - Tom
@Tom,激活脚本只是查找 PS1,而我已经定义了它。你指的是哪个环境变量?我该如何定义它? - Cerin
你需要在你提到的bash脚本中像这样设置变量,然后在激活脚本中查找变量的存在。 - Tom

0

我找不到任何通过作为子进程执行的脚本来完成这个任务的方法。调用单独的bash进程似乎会忘记之前设置的PS1。然而,如果我只是将脚本作为资源引入,这个问题就变得微不足道了:

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

0

看起来

exec /bin/bash -i

正在重置PS1变量。当我运行时

export PS1="foo "; bash

它也会重置它。有趣的是,当我查看bash源代码(shell.c和variables.c)时,它似乎使用

set_if_not ("PS1", primary_prompt);

进行初始化。但我不确定在这之间和main()函数之间发生了什么。放弃。


0

我在(RedHat CentOS)上尝试了一下,发现两者都有解决方案。

CYGWIN

经过一番调查,我发现问题出在/etc/bash.bashrc设置了PS1,这会覆盖PS1环境变量。所以你需要禁用运行该文件,方法如下:

/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
Cerin:你使用的是哪个版本的bash?在哪个平台上? - TrueY
在Ubuntu 12.04上的4.2.25版本 - Cerin
@Cerin:对不起!我没有意识到 '--rcfile' 与短选项混用会出问题!在最后一行 bash 命令中,请先删除 '-i' 再加上 '--rcfile'。 - TrueY
这修复了错误,但仍未显示自定义的PS1值。 - Cerin
@cerin:你可以尝试使用“--norc”版本吗? - TrueY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接