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

问题描述 投票:19回答:3

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

谢谢

python python-3.x command-line command-line-interface
3个回答
21
投票

你没记错的。

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

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

例如:

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

3
投票

很高兴将其设置为:

  1. 一种颜色,更好的视觉方面
  2. 空白或空格,以便于复制/粘贴操作

将其粘贴到您的bash shell中:

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


1
投票

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

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

这个事实带给你一个很好的奖励 - 你也可以使用非常量提示。你想在你的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__方法的预期目的是返回一个str实例。因此,当你用sys.ps2做同样的事情时,它会中断。 Python解释器期望__str__方法没有副作用,并且在打印PS1时显然评估str(sys.ps1)str(sys.ps2),而在打印PS2时,使用已经评估(和保存)的str(sys.ps2)值。结果是,如果你创建一个类似于上面的PS2PS1类,当你应该只看到PS1时,你会看到PS1和PS2,当你应该看到PS2时你什么都看不见。另一种情况不适用的情况是多个线程/进程正在写入控制台。然后来自几个线程的输出是交错的,虽然这也可能发生在正常的PS1上,但这种黑客使它更糟糕。

EDIT: Screenshot

screenshot

在这个简单的例子中它并没有那么糟糕(没有交错,只有混乱的颜色),但如果你得到“正确”的时间,它可能会更糟。

© www.soinside.com 2019 - 2024. All rights reserved.