这是我的脚本,目前为我的所有计算机设置了提示(无论是Windows,Red Hat还是OS X):
import sys
import datetime
import platform
if platform.system() is 'Windows':
tealUText = ""
tealText = ""
greenText = ""
defaultText = ""
else:
tealUText = "\001\033[4;36m\002"
tealText = "\001\033[0;36m\002"
greenText = "\001\033[0;32m\002"
defaultText = "\001\033[0;0m\002"
class ClockPS1(object):
def __repr__(self):
now = datetime.datetime.now()
clock = str(now.strftime("%H:%M:%S"))
return tealUText + clock + greenText + " >>> " + defaultText
sys.ps1 = ClockPS1()
sys.ps2 = greenText + " ... " + defaultText
在所有系统上,打印出当前时间,接着是普通">>>"提示在第一行,然后如果我有一个多行输入它有正常的" ..."提示,但缩进以便与">>>"提示(请记住,该提示以当前时间为前缀)。
这里提出了一个问题:在Windows以外的每个平台上,当前时间以蓝绿色打印(并加下划线),提示为绿色,无论我输入的是什么,都显示为正常颜色。如何在Windows中实现同样的功能?我已经看到了一些建议的解决方案,但是它们依赖于在打印消息时调用函数,由于ps
变量刚刚调用,我认为这对我不起作用关于分配给他们的任何内容__repr__
,对吗?
(顺便说一下,我从这里得到了这个时间技巧:python: display elapsed time on shell)
答案 0 :(得分:0)
在我的机器上(Windows 7)Python在执行时在命令提示符“terminal”中运行,据我所知,你只能更改该终端内所有文本的颜色,因为所有文本都将是相同的颜色。
我记得有人在谈论一个名为'clint'的库,应该支持MAC,Linux和Windows终端。这意味着要为现有脚本添加一些额外的功能。
答案 1 :(得分:0)
我突然想到,没有特别的理由限制自己只在PS1
课程中查找当前时间,事实上,为什么要将当前时间作为__repr__
返回,而我可以只打印时间和提示作为__repr__
函数的副作用,而是返回一个空字符串?
所以我添加了以下代码(混合了适当的平台检查 - 我将这些内容留下来,这样我就可以展示在Windows上使用这些工作的佼佼者):
from ctypes import *
# ... Skipped a lot of code which is the same as before...
STD_OUTPUT_HANDLE_ID = c_ulong(0xfffffff5)
windll.Kernel32.GetStdHandle.restype = c_ulong
std_output_hdl = windll.Kernel32.GetStdHandle(STD_OUTPUT_HANDLE_ID)
textText = 11
greenText = 10
defaultText = 15
class PS1(object):
def __repr__(self):
# ... Skipping a lot of code which is the same as before ...
windll.Kernel32.SetConsoleTextAttribute(std_output_hdl, tealText)
sys.stdout.write(clock)
windll.Kernel32.SetConsoleTextAttribute(std_output_hdl, greenText)
sys.stdout.write(" >>> ")
windll.Kernel32.SetConsoleTextAttribute(std_output_hdl, defaultText)
return ""
所以现在我得到了蓝绿色的时钟和绿色的提示 - 我想强调这么多工作!
我试着用PS2做类似的事情:
class PS2(object):
def __repr__(self):
windll.Kernel32.SetConsoleTextAttribute(std_output_hdl, greenText)
sys.stdout.write(" ... ")
windll.Kernel32.SetConsoleTextAttribute(std_output_hdl, defaultText)
return ""
这不行!当我尝试这样做时,我发现解释器会立即打印出PS1
和PS2
背靠背然后不显示{{ 1}}在后续行上。看起来它通常会在开始时获取所有PS2
并存储结果以便稍后显示。但是因为这种方法依赖于副作用,所以它暴露为它的黑客。
所以现在我只坚持PS# __repr__
" ... "
的正常sys.ps2
。
我很想听到让那些...
变成绿色的建议(我也没有做任何我打成绿色的东西),但我怀疑这可能是不可能的。我很乐意接受任何证明我错的答案 - 如果没有人在2天内到达,我可能会接受这个,直到其他人提出更好的东西。