这里是我的脚本,目前建立了我的提示所有的我的电脑(无论他们的Windows,红帽,或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__
上无论是分配给他们,对?
(顺便说一句,我从这里这次招: 蟒蛇:显示经过时间的外壳 )
在我的机器(Windows 7)中的Python运行在命令提示符“终端”执行而据我所知,你只能在所有的文字更改为终端内部的所有文本的颜色,这将是相同的颜色时。
我记得有人在谈论一个叫“克林特”图书馆应该支持MAC,Linux和Windows终端。 这将意味着增加了一些额外的到您现有的脚本虽然。
它发生,我认为没有特别的理由限制自己只找到当前的时间在我的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
背靠背,然后不显示PS2
在随后的行。 这似乎是它通常可以获得所有的PS# __repr__
s的一开始并把结果存储到后显示。 但是,由于这种方法依赖于副作用,它暴露,这是黑客。
所以现在,我只是一个普通坚持" ... "
的sys.ps2
。
我很想听听制作这些建议...
的绿色(不也使任何I型绿色),但我怀疑这可能是不可能的。 我会很乐意接受这证明我是错的任何答案 - 如果没有在2天内到达我可能就接受这一个,直到有人想出了更好的东西。