更改Python交互式提示">>>"

时间:2015-11-13 00:05:34

标签: python python-3.x command-line command-line-interface

这可能是一个愚蠢的问题,一旦我弄明白,我可能最终会删除它,但我发誓我记得在Python 3.5文档中阅读如何更改>>> Python交互式提示,例如调用help()将如何将其更改为help>。但出于某种原因,当我回去试图记住时,我却无法找到它的指示。有谁知道这是否可能,或者我只想象事情?

由于

3 个答案:

答案 0 :(得分:20)

你没记错的。

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

  

指定解释器的主要和辅助提示的字符串。仅在解释器处于交互模式时才定义这些。在这种情况下,它们的初始值是'>>> '和' ...'。如果将非字符串对象分配给任一变量,则每次解释器准备读取新的交互式命令时,都会重新评估其str();这可用于实现动态提示。

例如:

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

答案 1 :(得分:3)

将其设置为以下任一个很棒:

  1. 一种颜色可改善视觉效果
  2. 空白 空格,以便于复制/粘贴操作

将此粘贴​​到您的bash外壳中:

tee ~/.pyrc <<EOF
#!/usr/bin/env python3
import sys
sys.ps1='\x1b[1;49;33m>>>\x1b[0m '  # bright yellow
sys.ps2='\x1b[1;49;31m...\x1b[0m '  # bright red
#sys.ps1='\x1b[33m>>>\x1b[0m '      # dark yellow
#sys.ps2='\x1b[31m...\x1b[0m '      # dark red

# For easy copy/paste of proper code, use a blank or space:
#sys.ps1=' '
#sys.ps2=' '
EOF

# Then do this:
chmod 755 ~/.pyrc

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

export PYTHONSTARTUP=~/.pyrc

享受!

enter image description here

答案 2 :(得分:1)

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

幸运的是,提出sys.ps1的Python人士很慷慨(或很聪明?),足以让您将任何对象用作ps1,而不仅仅是字符串。然后使用其 __str__ 方法将分配的对象转换为字符串。这意味着您可以定义自己的类,例如。 Prompt,并使用其__str__方法执行任何操作,包括写入colorama包装的stdout(这将起作用!)。然后,您只需返回一个空字符串。

这个事实为您带来了可观的收益‒您还可以使用非恒定提示。您是否希望像在bash中一样在Python shell中创建日期?没问题。

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()

尽管这很好用,但由于__str__方法的预期目的是返回一个str实例,所以这是一种很怪异的方法。因此,当您使用sys.ps2做同样的事情时,它会中断。 Python解释器期望__str__方法没有副作用,并且在打印PS1时显然会评估str(sys.ps1)str(sys.ps2),而在打印PS2时,已经评估(并保存)的值使用str(sys.ps2)。结果是,如果您创建一个类似于上述PS2的{​​{1}}类,则您将只看到PS1时看到PS1 PS2,并且您将看到什么时候您应该看到PS2。另一种情况是,当多个线程/进程正在向控制台写入时,这种方法不能很好地工作。然后,将来自多个线程的输出进行交织,尽管在普通PS1中也可能发生这种情况,但这种黑客行为使情况变得更糟。

编辑:屏幕截图

screenshot

在这个简单的示例中,它还不错(没有交错,只是弄乱了颜色),但是如果您选择的时机“正确”,那可能会更糟。