Windows中的彩色Python提示?

时间:2014-05-30 13:39:24

标签: python windows-7 cmd command-prompt sys

这是我的脚本,目前为我的所有计算机设置了提示(无论是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

2 个答案:

答案 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 ""

这不行!当我尝试这样做时,我发现解释器会立即打印出PS1PS2背靠背然后不显示{{ 1}}在后​​续行上。看起来它通常会在开始时获取所有PS2并存储结果以便稍后显示。但是因为这种方法依赖于副作用,所以它暴露为它的黑客。

所以现在我只坚持PS# __repr__ " ... "的正常sys.ps2

我很想听到让那些...变成绿色的建议(我也没有做任何我打成绿色的东西),但我怀疑这可能是不可能的。我很乐意接受任何证明我错的答案 - 如果没有人在2天内到达,我可能会接受这个,直到其他人提出更好的东西。