有色Python提示符在Windows?(Colored Python Prompt in Wind

2019-10-20 05:04发布

这里是我的脚本,目前建立了我的提示所有的我的电脑(无论他们的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__上无论是分配给他们,对?

(顺便说一句,我从这里这次招: 蟒蛇:显示经过时间的外壳 )

Answer 1:

在我的机器(Windows 7)中的Python运行在命令提示符“终端”执行而据我所知,你只能在所有的文字更改为终端内部的所有文本的颜色,这将是相同的颜色时。

我记得有人在谈论一个叫“克林特”图书馆应该支持MAC,Linux和Windows终端。 这将意味着增加了一些额外的到您现有的脚本虽然。



Answer 2:

它发生,我认为没有特别的理由限制自己只找到当前的时间在我的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背靠背,然后不显示PS2在随后的行。 这似乎是它通常可以获得所有的PS# __repr__ s的一开始并把结果存储到后显示。 但是,由于这种方法依赖于副作用,它暴露,这是黑客。

所以现在,我只是一个普通坚持" ... "sys.ps2

我很想听听制作这些建议...的绿色(不也使任何I型绿色),但我怀疑这可能是不可能的。 我会很乐意接受这证明我是错的任何答案 - 如果没有在2天内到达我可能就接受这一个,直到有人想出了更好的东西。



文章来源: Colored Python Prompt in Windows?