更改Python 交互提示“>>>”

Change Python interactive prompt ">>>"

我记得读过,在 Python 3.5 文档中,如何在 Python 交互式提示中更改 >>>,例如调用 help() 将如何更改它至 help>.

但出于某种原因,当我回去尝试回忆时,我就是找不到它的说明。有谁知道这是否可能?

你没记错。

它在 sys 模块中 (sys.ps1 & sys.ps2):

Strings specifying the primary and secondary prompt of the interpreter. These are only defined if the interpreter is in interactive mode. Their initial values in this case are '>>> ' and '... '. If a non-string object is assigned to either variable, its str() is re-evaluated each time the interpreter prepares to read a new interactive command; this can be used to implement a dynamic prompt.

例如:

   >>> import sys
   >>> sys.ps1 = "3.5>>> "
   3.5>>> sys.ps2 = "3.5... "
   3.5>>>

最好将其设置为:

  1. a color 以获得更好的视觉效果
  2. a 空白space 以便于 copy/paste 操作

将此粘贴到您的 Bash shell:

tee ~/.pyrc <<EOF
#!/usr/bin/env python3
import sys

# You also need \x01 and \x02 to separate escape sequence, due to:
# 
sys.ps1='\x01\x1b[1;49;33m\x02>>>\x01\x1b[0m\x02 '  # bright yellow
sys.ps2='\x01\x1b[1;49;31m\x02...\x01\x1b[0m\x02 '  # bright red
EOF

最后将此行添加到您的 ~/.bash_profile:

export PYTHONSTARTUP=~/.pyrc


如果您使用 Windows,请使用其中之一:

# Set it Temperarily (for this session)
$env:PYTHONSTARTUP="C:\Users\<USERNAME>\.pyrc"                                                  

# Set it Locally:  HKEY_CURRENT_USER
[Environment]::SetEnvironmentVariable("PYTHONSTARTUP", 'C:\Users\<USERNAME>\.pyrc', 'User')     

# Set it Globaly: HKEY_LOCAL_MACHINE
[Environment]::SetEnvironmentVariable("PYTHONSTARTUP", 'C:\Users\<USERNAME>\.pyrc', 'Machine')  

# Set it Globaly: HKEY_LOCAL_MACHINE (also in CMD)
setx /m PYTHONSTARTUP "%HOME%\.pyrc"                                                        

尽情享受吧!

如果您在 Windows (cmd.exe) 上并且想要彩色提示,您可以使用 colorama,但有一些注意事项。如果您在 PYTHONSTARTUP 中调用 colorama.init 并将包含着色转义码的字符串分配给 sys.ps1,它将不起作用。但是,当您使用包含着色转义码的字符串调用 print 时,彩色输出确实有效。

幸运的是,提出 sys.ps1 的 Python 人非常慷慨(或聪明?),足以让您将任何对象用作 ps1,而不仅仅是字符串。然后使用其 __str__ 方法将分配的对象转换为字符串。这意味着您可以定义自己的 class,例如。 Prompt,并在其 __str__ 方法中做 任何事情,包括写入 colorama-wrapped stdout(这会起作用!)。然后你只需 return 一个空字符串。

这个事实给您带来了不错的好处 ‒ 您还可以使用 非常量提示符。您想要 Python shell 中的约会对象,就像 bash 中那样吗?没问题。

import sys
import datetime
import colorama

colorama.init(autoreset=True)

class Prompt:
  def __str__(self):
    print(self.prompt, end='')
    return ''

class PS1(Prompt):

  @property
  def prompt(self):
    return '{brace_c}[{time_c}{time}{brace_c}]{prompt_c}>>> '.format(
              brace_c  = colorama.Fore.BLACK + colorama.Style.BRIGHT,
              # style is preserved, so the following are also bright:
              prompt_c = colorama.Fore.LIGHTYELLOW_EX,
              time_c   = colorama.Fore.BLACK,
              time     = datetime.datetime.now().strftime('%H:%M'),
            )

sys.ps1 = PS1()

虽然这工作得很好,但它是一种相当 hacky 的方式,因为 __str__ 方法的预期目的是 return 一个 str 实例。因此,当您对 sys.ps2 做同样的事情时它会中断。 Python 解释器期望 __str__ 方法没有副作用,并且显然在打印 PS1 时评估 str(sys.ps1)str(sys.ps2),而在打印 [=56] 时=] 使用已经评估(并保存)的 str(sys.ps2) 值。结果是,如果您创建一个类似于上面 PS1PS2 class,您将同时看到 PS1 PS2的时候应该只看到PS1,应该看到的时候什么也看不到PS2。另一种效果不佳的情况是多个线程/进程正在写入控制台。然后来自多个线程的输出交错,虽然这也可能发生在正常 PS1 上,但这种 hack 使情况变得更糟。

编辑:截图

在这个简单的例子中,它还不错(没有交错,只是颜色乱了),但如果你得到时间 "right",它可能会更糟。