更改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>>>
最好将其设置为:
- a color 以获得更好的视觉效果
- 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)
值。结果是,如果您创建一个类似于上面 PS1
的 PS2
class,您将同时看到 PS1 和 PS2的时候应该只看到PS1,应该看到的时候什么也看不到PS2。另一种效果不佳的情况是多个线程/进程正在写入控制台。然后来自多个线程的输出交错,虽然这也可能发生在正常 PS1 上,但这种 hack 使情况变得更糟。
编辑:截图
在这个简单的例子中,它还不错(没有交错,只是颜色乱了),但如果你得到时间 "right",它可能会更糟。
我记得读过,在 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>>>
最好将其设置为:
- a color 以获得更好的视觉效果
- 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)
值。结果是,如果您创建一个类似于上面 PS1
的 PS2
class,您将同时看到 PS1 和 PS2的时候应该只看到PS1,应该看到的时候什么也看不到PS2。另一种效果不佳的情况是多个线程/进程正在写入控制台。然后来自多个线程的输出交错,虽然这也可能发生在正常 PS1 上,但这种 hack 使情况变得更糟。
编辑:截图
在这个简单的例子中,它还不错(没有交错,只是颜色乱了),但如果你得到时间 "right",它可能会更糟。