我记得在Python 3.5文档中阅读到了如何更改Python交互式提示符上的>>>
,例如调用help()
会将其更改为help>
。
但出于某种原因,当我回去尝试回忆时,我就是找不到它的说明。有人知道是否可能吗?
我记得在Python 3.5文档中阅读到了如何更改Python交互式提示符上的>>>
,例如调用help()
会将其更改为help>
。
但出于某种原因,当我回去尝试回忆时,我就是找不到它的说明。有人知道是否可能吗?
你记得的没错。
这在 sys 模块中定义了两个字符串变量 (sys.ps1 和 sys.ps2):
指定解释器主提示符和辅助提示符的字符串。这些变量仅在交互模式下定义。在此情况下,它们的初始值分别为'>>> '和'... '。如果将非字符串对象分配给任一变量,则每次解释器准备读取新的交互式命令时都会重新计算其str();这可用于实现动态提示符。
例如:
>>> import sys >>> sys.ps1 = "3.5>>> " 3.5>>> sys.ps2 = "3.5... " 3.5>>>
将其设置为以下任一选项都很好:
将此内容粘贴到你的Bash shell中:
tee ~/.pyrc <<EOF
#!/usr/bin/env python3
import sys
# You also need \x01 and \x02 to separate escape sequence, due to:
# https://dev59.com/IGox5IYBdhLWcg3wDgIz#9468954
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"
享受吧!
TRUECOLOR
的终端的,据我所知。还可以尝试使用ConEmu。 - not2qubitprint
或者写入到标准输出时,Colorama在Windows上运行良好。问题只出现在sys.ps1
上 - 由于某种原因,即使我用AnsiToWin32
包装器替换了sys.stdin
和sys.__stdin__
,它仍然会将转义字符打印到终端上。我认为CPython交互式解释器写入ps1
的流在启动时被硬编码或保存,并忽略后来对sys.stdout
的更改。 - kyrillRL_PROMPT_START_IGNORE
(\x01
)和RL_PROMPT_END_IGNORE
(\x02
)特殊序列,由readline使用,以跟踪包含转义序列的字符串长度。解决方案的详细信息可以在这里找到。 - not2qubitcmd.exe
),并且想要一个带颜色的提示符,可以使用colorama
,但有一些注意事项。如果在PYTHONSTARTUP
中调用colorama.init
并将包含着色转义代码的字符串分配给sys.ps1
,它将无法正常工作。然而,当您使用包含着色转义代码的字符串调用print
时,彩色输出确实有效。sys.ps1
的Python开发人员足够慷慨(或聪明?),让您可以使用任何对象作为ps1
,而不仅仅是字符串。然后会使用其__str__
方法将指定的对象转换为字符串。这意味着您可以定义自己的类,例如Prompt
,并在其__str__
方法中执行任何操作,包括写入已经使用colorama封装的stdout(这将起作用!)。然后只需返回空字符串即可。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)
值。结果是,如果您创建与上面的PS1
类似的PS2
类,则应该只看到PS1,但您将同时看到PS1和PS2,并且在应该看到PS2时什么也看不到。另一个这种方法效果不佳的情况是多个线程/进程正在写入控制台。然后,来自几个线程的输出被交错,虽然这也可能发生在正常的PS1中,但这种hack使情况变得更糟。
在这个简单的例子中,情况还不算太糟糕(没有交错,只有颜色混乱),但如果你把时间掌握得“恰当”,情况会更糟。colorama.init(autoreset=True)
,所以没有必要禁用颜色。正如您在屏幕截图中看到的那样,我在终端中编写的文本(例如from threading import Thread
)是白色的,这是我的正常文本颜色。启动线程写入的文本test
也是白色的。问题在于括号关闭之前的提示部分应该不是白色,但它却是白色的。因此,问题实际上是颜色没有被启用,而不是被禁用了。 - kyrillNORMAL
或RESET_ALL
。而且由于你正在使用线程,你可能需要在其他地方提前定义这些(例如brace_c
等)项。当你不再使用它们时,为什么还要定义它们呢? - not2qubitRESET_ALL
,因为你不知道线程函数如何处理非 ASCII 字符。 - not2qubit