วิธีพิมพ์ข้อความสีในเทอร์มินัลใน Python


2127

ฉันจะส่งข้อความสีไปยังเครื่องเทอร์มินัลใน Python ได้อย่างไร? สัญลักษณ์ Unicode ที่ดีที่สุดในการเป็นตัวแทนของบล็อกที่มั่นคงคืออะไร?


6
คุณควรระบุข้อมูลเพิ่มเติมเพื่อรับการตอบสนองที่ดีขึ้น: มัลติแพลตฟอร์ม? โมดูลภายนอกได้รับการยอมรับหรือไม่
sorin

2
IPython ทำมันข้ามแพลตฟอร์ม ดูสิ่งที่พวกเขาใช้?
endolith

สัญลักษณ์นี้จะทำให้บล็อกสีที่ยอดเยี่ยม: ปัญหาเดียวก็คือว่ามันจะขยาย ASCII บางทีคุณอาจได้รับมันเพื่อใช้งานhttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif

เทอร์มินัลบางตัวยังสามารถแสดงอักขระ Unicode ได้ หากเป็นจริงสำหรับเทอร์มินัลของคุณอักขระที่เป็นไปได้นั้นแทบจะไม่ จำกัด
ayke

4
คำตอบนี้มาค่อนข้างช้า แต่ดูเหมือนจะดีที่สุดสำหรับฉัน ... คำที่โหวตข้างต้นต้องใช้แฮ็กพิเศษสำหรับ Windows ในขณะที่ใช้งานได้เพียงอย่างเดียว: stackoverflow.com/a/3332860/901641
ArtOfWarfare

คำตอบ:


1833

สิ่งนี้ขึ้นอยู่กับแพลตฟอร์มที่คุณใช้ วิธีที่พบได้บ่อยที่สุดคือการพิมพ์ ANSI escape sequences ตัวอย่างง่ายๆต่อไปนี้เป็นรหัสไพ ธ อนจากสคริปต์ blender build :

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

ในการใช้รหัสเช่นนี้คุณสามารถทำสิ่งต่างๆได้

print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)

หรือด้วย Python3.6 +:

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

สิ่งนี้จะทำงานบนยูนิกซ์รวมถึง OS X, linux และ windows (หากคุณใช้ANSICONหรือใน Windows 10 หากคุณเปิดใช้งานการจำลอง VT100 ) มีรหัส ansi สำหรับตั้งค่าสีเลื่อนเคอร์เซอร์และอื่น ๆ

หากคุณกำลังจะซับซ้อนกับสิ่งนี้ (และดูเหมือนว่าคุณกำลังเขียนเกม) คุณควรดูในโมดูล "คำสาป" ซึ่งจัดการส่วนที่ซับซ้อนของสิ่งนี้ให้คุณ หลามคำสาป Howtoคือการแนะนำที่ดี

หากคุณไม่ได้ใช้ ASCII แบบขยาย (เช่นไม่ได้อยู่บนพีซี) แสดงว่าคุณติดอักขระ ASCII ที่ต่ำกว่า 127 และ '#' หรือ '@' น่าจะเป็นทางออกที่ดีที่สุดสำหรับบล็อกของคุณ หากคุณสามารถมั่นใจได้ว่าเทอร์มินัลของคุณกำลังใช้ชุดอักขระ IBM ascii แบบขยายคุณมีตัวเลือกมากมาย อักขระ 176, 177, 178 และ 219 คือ "บล็อกอักขระ"

โปรแกรมที่ใช้ข้อความที่ทันสมัยบางอย่างเช่น "ป้อมปราการคนแคระ" เลียนแบบโหมดข้อความในโหมดกราฟิกและใช้รูปภาพของแบบอักษรพีซีคลาสสิค คุณสามารถค้นหาบิตแมปเหล่านี้บางส่วนที่คุณสามารถใช้กับDwarf Fortress Wikiดู ( ชุดไพ่ที่ผู้ใช้สร้างขึ้น )

การประกวดสาธิตโหมดข้อความมีแหล่งข้อมูลเพิ่มเติมสำหรับการทำกราฟิกในโหมดข้อความ

อืม .. ฉันคิดว่าคำตอบนี้ไปนิดนึง ฉันอยู่ในท่ามกลางการวางแผนเกมผจญภัยที่ใช้ข้อความเป็นหลัก ขอให้โชคดีกับข้อความสีของคุณ!


แต่สมมติว่าค่าเริ่มต้นของฉันไม่ใช่สีดำ - คุณคิดว่าเป็นไปได้ไหมที่จะสร้าง python resotre หลังจากใช้เทคนิคเหล่านี้
Adobe

4
บน Linux คุณอาจต้องการที่จะใช้tput, ชอบเพราะมันจะส่งผลในโค้ดแบบพกพาอื่น ๆ
Martin Ueding

3
@Cawas: กรณีการใช้งานจริงdisableคือเมื่อคุณไพพ์เอาต์พุตไปยังไฟล์; ในขณะที่เครื่องมือเช่นcatอาจสนับสนุนสีโดยทั่วไปจะดีกว่าถ้าไม่พิมพ์ข้อมูลสีลงในไฟล์
เซบาสเตียนมัค

1
@AlexanderSimko นี่เป็นข้อมูลโค้ด ctypes เพื่อเปิดใช้งานการสนับสนุน VT100 ใน Windows import ctypes; kernel32 = ctypes.WinDLL('kernel32'); hStdOut = kernel32.GetStdHandle(-11); mode = ctypes.c_ulong(); kernel32.GetConsoleMode(hStdOut, ctypes.byref(mode)); mode.value |= 4; kernel32.SetConsoleMode(hStdOut, mode)10:
Eryk Sun

1
สำหรับทุกคนที่ใช้โค้ดตัวอย่างของ Python จากคำตอบ: ควรสังเกตว่าสีในช่วง 90-97 และ 100-107 นั้นไม่ได้มาตรฐานและแท้จริงแล้วในเทอร์มินัลของฉันพวกเขาไม่ได้ให้สีที่ระบุโดย ชื่อตัวแปร เป็นการดีกว่าที่จะใช้ช่วงมาตรฐาน 30-37 และ 40-47 ที่มา: en.wikipedia.org/wiki/…
balu

807

ฉันประหลาดใจไม่มีใครได้กล่าวถึงโมดูล termcolor หลาม การใช้งานค่อนข้างง่าย:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

หรือใน Python 3:

print(colored('hello', 'red'), colored('world', 'green'))

มันอาจไม่ซับซ้อนพอสำหรับการเขียนโปรแกรมเกมและ "บล็อกสี" ที่คุณต้องการ ...


2
เนื่องจากมันปล่อยรหัส ANSI มันทำงานบน Windows (คอนโซลดอส) หรือไม่หากโหลด ansi.sys support.microsoft.com/kb/101875
Phil P

37
เพิ่งสังเกตเห็นว่า ณ วันที่ 13/01/2011 ขณะนี้อยู่ภายใต้ใบอนุญาต MIT
Alexander Tsepkov

12
ไม่มี unittests (ต่างจาก colorama) และไม่ได้อัปเดตตั้งแต่ 2011
Janus Troelsen

5
termcolor.COLORSแสดงรายการสีให้คุณ
akxlr

23
บน Windows รันos.system('color')ครั้งแรกดังนั้น ANSI escape sequences จะเริ่มทำงาน
Szabolcs

717

คำตอบคือColoramaสำหรับการระบายสีข้ามแพลตฟอร์มทั้งหมดใน Python

ภาพตัวอย่างหน้าจอ Python 3.6: ภาพตัวอย่าง


317
ในฐานะผู้เขียน Colorama ขอขอบคุณสำหรับการกล่าวถึง @ nbv4 ฉันจะพยายามอธิบายให้กระจ่าง: Colorama มุ่งหวังที่จะให้โปรแกรม Python พิมพ์ข้อความเทอร์มินัลสีบนแพลตฟอร์มทั้งหมดโดยใช้รหัส ANSI เดียวกันตามที่อธิบายไว้ในคำตอบอื่น ๆ อีกมากมายในหน้านี้ ใน Windows Colorama จะแยกอักขระ ANSI เหล่านี้ออกจาก stdout และแปลงเป็นการโทร win32 ที่เทียบเท่ากันสำหรับข้อความสี ในแพลตฟอร์มอื่น Colorama ไม่ทำอะไรเลย ดังนั้นคุณสามารถใช้รหัส ANSI หรือโมดูลเช่น Termcolor และด้วย Colorama พวกเขาเพียงแค่ทำงานบนแพลตฟอร์มทั้งหมด เป็นความคิดนั้น แต่อย่างใด
Jonathan Hartley

2
@ Jonathan, นี่เป็นห้องสมุดที่ยอดเยี่ยมจริงๆ! ความสามารถในการข้ามสี Python output ของแพลตฟอร์มนั้นดีและมีประโยชน์จริงๆ ฉันกำลังจัดหาเครื่องมือสำหรับไลบรารีที่ใช้สีคอนโซลของตัวเอง ฉันสามารถเปลี่ยนทิศทางเอาต์พุตของคอนโซลนั้นไปยังเทอร์มินัลและกำหนดสีเอาต์พุต ตอนนี้ฉันสามารถเพิ่มไลบรารีหนึ่งรายการและให้ผู้ใช้เลือกสีได้ สิ่งนี้จะทำให้คนตาบอดสีสามารถตั้งค่าสิ่งต่าง ๆ ให้ทำงานได้เพื่อที่พวกเขาจะได้เห็นผลลัพธ์จริง ๆ ขอบคุณ
Demolishun

50
สิ่งนี้ควรอยู่ในไลบรารีมาตรฐาน ... การสนับสนุนสีข้ามแพลตฟอร์มเป็นสิ่งสำคัญฉันคิดว่า
daviewales

5
Colorama ยอดเยี่ยมมาก! นอกจากนี้ยังมีการดูansimarkupซึ่งสร้างขึ้นใน colorama และช่วยให้คุณใช้มาร์กอัปแบบแท็ก (เช่น<b>bold</b>) เพื่อเพิ่มสไตล์ให้กับข้อความเทอร์มินัล
gvalkov

30
วิธีนี้ใช้ไม่ได้หากไม่มีการเรียก colorama.init () โหวต!
Smit Johnth

428

พิมพ์สตริงที่เริ่มสี / สไตล์จากนั้นเลือกสตริงจากนั้นสิ้นสุดการเปลี่ยนสี / สไตล์ด้วย'\x1b[0m':

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

ประสบความสำเร็จกับตัวอย่างพื้นหลังสีเขียว

รับตารางตัวเลือกการจัดรูปแบบสำหรับข้อความเชลล์ด้วยรหัสต่อไปนี้:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

ตัวอย่างแสงน้อย (สมบูรณ์)

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างที่มีแสงน้อย (บางส่วน)

ส่วนบนของเอาท์พุท


8
ใช้งานได้ในเชลล์ส่วนใหญ่และ ipython ดีพอสำหรับแอปพลิเคชันส่วนใหญ่
dashesy

4
ฉันจะถามได้ไหมว่าขั้วนี้คืออะไร
FlipTack

4
มันพกพาได้อย่างไร?
Ruggero Turra

2
การใช้งานแบบสแตนด์อโลนแบบสั้น: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920
Jonathan H

203

กำหนดสตริงที่เริ่มสีและสตริงที่สิ้นสุดสีจากนั้นพิมพ์ข้อความของคุณด้วยสตริงเริ่มต้นที่ด้านหน้าและสตริงสุดท้ายที่ท้าย

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

นี้ผลิตต่อไปนี้ในbashในurxvtที่มีโทนสี Zenburn สไตล์:

สีเอาท์พุท

ผ่านการทดลองเราจะได้สีเพิ่มขึ้น:

เมทริกซ์สี

หมายเหตุ: \33[5mและ\33[6mกำลังกระพริบ

ด้วยวิธีนี้เราสามารถสร้างคอลเลกชันสีเต็มรูปแบบ:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

นี่คือรหัสในการสร้างการทดสอบ:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x=x+5

2
คุณทำการกะพริบ txt อย่างไร
WiLL_K

2
เชลล์หรือเทอร์มินัลใดที่ทำให้กะพริบ
Zypps987

1
(u) rxvt เช่น
qubodup

6
ข้อความที่กระพริบตาทำงานได้ดีจริงๆ ฉันจะหยุดมันได้อย่างไร ภาพที่ต่อเนื่องกันทั้งหมดกะพริบอยู่ด้วยเหตุผล เทอร์มินัลของฉันคิดว่าถึงเวลาปาร์ตี้แล้ว!
กัปตัน

3
ในตอนท้ายของสตริงที่จะกระพริบวาง\33[0mหรือCENDสูงกว่า
Stiffy2000

94

คุณต้องการเรียนรู้เกี่ยวกับ ANSI escape sequences นี่เป็นตัวอย่างสั้น ๆ :

CSI="\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")

สำหรับข้อมูลเพิ่มเติมดูที่http://en.wikipedia.org/wiki/ANSI_escape_code

สำหรับอักขระบล็อกให้ลองใช้อักขระ unicode เช่น \ u2588:

print(u"\u2588")

วางมันทั้งหมดเข้าด้วยกัน:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")

3
ลองdef d(*v): return '\x1B['+';'.join(map(str, v))+'m'แล้วprint ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
Evgeni Sergeev

ความหมายของการรีเซ็ตที่นี่คืออะไร?
MohitC

71

ฉันกำลังตอบสนองเพราะฉันพบวิธีใช้รหัส ANSI บน Windows 10 เพื่อให้คุณสามารถเปลี่ยนสีของข้อความโดยไม่ต้องมีโมดูลใด ๆ ที่ไม่ได้มีอยู่แล้ว:

บรรทัดที่ใช้ทำงานนี้os.system("")หรือการเรียกระบบอื่นใดซึ่งอนุญาตให้คุณพิมพ์รหัส ANSI ในเทอร์มินัล:

import os

os.system("")

# Group of Different functions for different styles
class style():
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'

print(style.YELLOW + "Hello, World!")

หมายเหตุ: แม้ว่าตัวเลือกนี้จะมีตัวเลือกเหมือนกับตัวเลือก Windows อื่น ๆ แต่ Windows ไม่รองรับรหัส ANSI ทั้งหมดแม้จะใช้วิธีนี้ก็ตาม สีตกแต่งข้อความไม่ทำงานและสี 'สดใส' ทั้งหมด (รหัส 90-97 และ 100-107) แสดงผลเหมือนกับสีปกติ (รหัส 30-37 และ 40-47)

แก้ไข : ขอบคุณ @jl สำหรับการค้นหาวิธีการที่สั้นลง

tl; dr : เพิ่มos.system("")ที่ด้านบนสุดของไฟล์ของคุณ

Python เวอร์ชั่น: 3.6.7


2
ใช้งานได้ - ฉันแปลกใจจริงๆที่คำสั่ง color เปิดใช้งานรหัส ANSI ในเทอร์มินัล Windows ฉันใช้เวลาหลายปีโดยไม่ทราบว่ามันเป็นไปได้ - คำสั่งนั้นไม่ได้ให้เงื่อนงำใด ๆ
Stuart Axon

1
เรียบง่ายและทำงานได้อย่างสมบูรณ์แบบ ขอบคุณ
Ari

3
เพื่อให้ชัดเจนนี่จะใช้งานได้กับ Windows 10
Anaksunaman

2
ไม่ทำงานใน Windows 7 / 8.1
Nikos

2
ขอบคุณมากสำหรับคำตอบของคุณ @ SimpleBinary! เล่นรอบกับคำตอบของคุณฉันได้พบว่าคุณสามารถลดความซับซ้อนยิ่งขึ้นโดยเพียงแค่การแทนที่มันมีเพียงแค่if sys.platform.lower() == "win32": os.system('color') os.system('')ไม่จำเป็นต้องมีเงื่อนไขและรหัสจะทำงานทั้งใน Windows 10 และ Linux (เมื่อฉันทดสอบ) colorในขณะที่คุณสามารถดูคุณจะได้ไม่ต้องโทรออกระบบ โทรไปdir, cd, abcdefและเพียงแค่ที่ว่างเปล่าปรับการทำงานสตริง (แม้ว่าสายไม่ว่างเปล่าจะมีแนวโน้มที่พิมพ์เอาท์พุทที่คุณไม่ต้องการที่จะเห็น)
JL

60

วิธีที่ฉันชอบคือห้องสมุดBlessings (การเปิดเผยอย่างเต็มรูปแบบ: ฉันเขียน) ตัวอย่างเช่น:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

ในการพิมพ์อิฐสีวิธีที่น่าเชื่อถือที่สุดคือการพิมพ์ช่องว่างด้วยสีพื้นหลัง ฉันใช้เทคนิคนี้เพื่อวาดแถบความคืบหน้าในแบบก้าวหน้าจมูก :

print t.on_green(' ')

คุณสามารถพิมพ์ในสถานที่เฉพาะได้เช่นกัน:

with t.location(0, 5):
    print t.on_yellow(' ')

หากคุณต้องมีความสามารถด้านเทอร์มินัลอื่น ๆ ในระหว่างการเล่นเกมคุณสามารถทำได้เช่นกัน คุณสามารถใช้การจัดรูปแบบสตริงมาตรฐานของ Python เพื่อให้อ่านได้:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

สิ่งที่ดีเกี่ยวกับ Blessings ก็คือการทำให้ดีที่สุดในการทำงานกับขั้วทุกประเภทไม่ใช่แค่ ANSI สี (ทั่วไปที่โด่งดัง) นอกจากนี้ยังช่วยให้ลำดับการหลีกเลี่ยงที่อ่านไม่ได้ออกจากรหัสของคุณในขณะที่ยังคงใช้งานได้อย่างกระชับ มีความสุข!


65
การใส่สีเป็นชื่อฟังก์ชั่นและไม่เป็นพารามิเตอร์เป็นแนวปฏิบัติที่น่าสงสัย
LtWorf

1
@LWWorf: คุณสามารถทำให้มันเป็นพารามิเตอร์ที่ใช้getattrหากคุณต้องการ หรือน่าจะเป็นเพียงแค่สร้างสตริงรูปแบบแบบไดนามิกแทน
jfs

8
@ พิสูจน์ความจริงที่ว่าคุณสามารถทำได้ไม่ได้หมายความว่าคุณควรทำ โดยทั่วไปแล้วถ้าสีเป็นพารามิเตอร์ที่คุณสามารถผ่านได้
LtWorf

2
คุณcan just passเป็นฟังก์ชั่นของหลาม
MaxNoe

2
โปรดทราบว่าการนำเข้าพรไม่ทำงานบน windows ดังนั้นอย่าใช้มันหากสคริปต์ของคุณต้องข้ามแพลตฟอร์ม
Adversus

58

styคล้ายกับ colorama แต่มีความละเอียดน้อยกว่ารองรับสี8 บิตและ24 บิต (rgb) ช่วยให้คุณสามารถลงทะเบียนสไตล์ของคุณเองรองรับการปิดเสียงมีความยืดหยุ่นบันทึกได้ดีและอื่น ๆ อีกมากมาย

ตัวอย่าง:

from sty import fg, bg, ef, rs

foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs

# Add custom colors:

from sty import Style, RgbFg

fg.orange = Style(RgbFg(255, 150, 50))

buf = fg.orange + 'Yay, Im orange.' + fg.rs

print(foo, bar, baz, qux, qui, buf, sep='\n')

พิมพ์:

ป้อนคำอธิบายรูปภาพที่นี่

การสาธิต: ป้อนคำอธิบายรูปภาพที่นี่


7
มันจะมีประโยชน์มากถ้าคุณพิจารณาที่จะเปรียบเทียบกับ colorama ฉันชอบห้องสมุดของคุณ แต่เพียงเพราะ api สั้นกว่าจากกล่องและมันจะดีถ้ามันจะได้รับความนิยมมากขึ้น ขอบคุณ!
Victor Gavro

ฉันชอบกุ้งยิงและฉันพยายามที่จะจัดรูปแบบสตริงของฉันด้วยกุ้งยิงปัญหาหนึ่งคือเมื่อฉันพิมพ์หลายสีฉันจะรีเซ็ตเป็นสีก่อนหน้าแทนที่จะเป็นสีเริ่มต้นได้หรือไม่?
intijk

@VictorGavro นั่นเป็นความคิดที่ดี! ฉันอาจเพิ่มการเปรียบเทียบกับเอกสารประกอบ
Rotareti

@intijk คำถามของคุณไม่ตรงกับส่วนความคิดเห็น สำหรับคำถามประเภทนี้โปรดสร้างคำถาม SO ใหม่หรือใช้ตัวติดตามปัญหา Github
Rotareti

53

สร้างคลาสด้วยสีทั้งหมดโดยใช้สำหรับลูปเพื่อวนซ้ำทุกสีที่รวมกันสูงสุด 100 แล้วเขียนคลาสด้วยสีหลาม คัดลอกและวางตามที่คุณต้องการ GPLv2 โดยฉัน:

class colors:
    '''Colors class:
    reset all colors with colors.reset
    two subclasses fg for foreground and bg for background.
    use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'

44

ลองใช้รหัสง่ายๆนี้

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello world")

19
คำแนะนำ: กำหนด lambdas ที่คืนค่าสตริงสีนั้นแทนที่จะพิมพ์โดยตรงเพื่อให้สามารถใช้ร่วมกับสตริงอื่นได้
gustafbstrom

34

บน Windows คุณสามารถใช้โมดูล 'win32console' (มีให้ใน Python ดิสทริบิวชัน) หรือโมดูล 'ctypes' (Python 2.5 ขึ้นไป) เพื่อเข้าถึง Win32 API

หากต้องการดูรหัสที่สมบูรณ์แบบที่สนับสนุนทั้งสองวิธีให้ดูที่สีคอนโซลรหัสรายงานจากTestoob

ตัวอย่าง ctypes:

import ctypes

# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED    = 0x0004 # text color contains red.

def get_csbi_attributes(handle):
    # Based on IPython's winconsole.py, written by Alexander Belchenko
    import struct
    csbi = ctypes.create_string_buffer(22)
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
    assert res

    (bufx, bufy, curx, cury, wattr,
    left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
    return wattr


handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)

ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)

2
สุจริตนี่เป็นทางออกเดียวที่ทำงานกับ windows คำตอบอื่น ๆ ทั้งหมดเป็นเพียงสำเนาของแต่ละคน
Danilo

FWIW บน Windows อาจมีความเจ็บปวดน้อยกว่าในการใช้ ConEmu ซึ่งรองรับลำดับ ANSI (นอกเหนือจากโฮสต์ของข้อดีอื่น ๆ ผ่านเทอร์มินัลเนทีฟ) ยังดีที่มีวิธีแก้ปัญหาพื้นเมืองแม้ว่า
Endre ทั้ง

ฉันอยู่กับ Danilo
มูฮัมหมัดอาลี

24

เรียบง่ายอย่างน่าประหลาดใจตามคำตอบของ @ joeld

class PrintInColor:
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    LIGHT_PURPLE = '\033[94m'
    PURPLE = '\033[95m'
    END = '\033[0m'

    @classmethod
    def red(cls, s, **kwargs):
        print(cls.RED + s + cls.END, **kwargs)

    @classmethod
    def green(cls, s, **kwargs):
        print(cls.GREEN + s + cls.END, **kwargs)

    @classmethod
    def yellow(cls, s, **kwargs):
        print(cls.YELLOW + s + cls.END, **kwargs)

    @classmethod
    def lightPurple(cls, s, **kwargs):
        print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)

    @classmethod
    def purple(cls, s, **kwargs):
        print(cls.PURPLE + s + cls.END, **kwargs)

จากนั้นเพียงแค่

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')

2
สิ่งนี้จะล้มเหลวหากคุณส่งอาร์กิวเมนต์มากกว่าหนึ่งตำแหน่งหรือสิ่งอื่นใดที่ไม่ใช่ประเภทสตริง
Romain Vincent

@RomainVincent แล้วอย่าผ่านอาร์กิวเมนต์มากกว่าหนึ่งตำแหน่งหรือสิ่งอื่นใดนอกจากสตริงไท - รอนี่คือprint-replacements ? การคัดค้านถูกยกเลิก
wizzwizz4

1
@ wizzwizz4 ฉันไม่แน่ใจว่าคุณหมายถึงอะไรกับความคิดเห็นนี้ฉันไม่เห็นประเด็น หากคุณกำลังจะเสนอคลาส ... เพื่อแทนที่วิธีการที่ง่ายเหมือนการพิมพ์คุณอาจหลีกเลี่ยงการทำให้มันแตกง่าย แค่ความเห็นของฉัน
Romain Vincent

1
@RomainVincent ฉันจะบอกว่าการคัดค้านของคุณผิด แต่สำหรับการเปลี่ยนฟังก์ชั่นที่หลากหลายprintนั้นควรทำให้แน่ใจว่าได้ทำซ้ำการทำงานของมันอย่างถูกต้อง
wizzwizz4

1
@RomainVincent ใช้ในการใช้อาร์กิวเมนต์ที่ไม่มีที่สิ้นสุด: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</code>
Emilien Baudet

23

ฉันได้รวม @joeld คำตอบไว้ในโมดูลที่มีฟังก์ชั่นทั่วโลกที่ฉันสามารถใช้ที่ใดก็ได้ในรหัสของฉัน

ไฟล์: log.py

HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = "\033[1m"

def disable():
    HEADER = ''
    OKBLUE = ''
    OKGREEN = ''
    WARNING = ''
    FAIL = ''
    ENDC = ''

def infog( msg):
    print OKGREEN + msg + ENDC

def info( msg):
    print OKBLUE + msg + ENDC

def warn( msg):
    print WARNING + msg + ENDC

def err( msg):
    print FAIL + msg + ENDC

ใช้ดังต่อไปนี้:

 import log
    log.info("Hello World")
    log.err("System Error")

22

สำหรับ Windows คุณไม่สามารถพิมพ์ไปที่คอนโซลด้วยสีได้หากคุณไม่ได้ใช้ win32api

สำหรับ Linux นั้นง่ายเหมือนการใช้งานการพิมพ์โดยมี escape sequences ที่ระบุไว้ที่นี่:

สี

เพื่อให้ตัวละครพิมพ์เหมือนกล่องขึ้นอยู่กับตัวอักษรที่คุณใช้สำหรับหน้าต่างคอนโซล สัญลักษณ์ปอนด์ทำงานได้ดี แต่ขึ้นอยู่กับแบบอักษร:

#

21
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS

fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"

def print_six(row, format, end="\n"):
    for col in range(6):
        color = row*6 + col - 2
        if color>=0:
            text = "{:3d}".format(color)
            print (format(text,color), end=" ")
        else:
            print(end="    ")   # four spaces
    print(end=end)

for row in range(0, 43):
    print_six(row, fg, " ")
    print_six(row, bg)

# Simple usage: print(fg("text", 160))

ข้อความที่มีการเปลี่ยนแปลงเบื้องหน้าและพื้นหลังสี 0..141 ข้อความที่มีการเปลี่ยนแปลงเบื้องหน้าและพื้นหลังสี 142..255


20

ฉันลงเอยด้วยการทำสิ่งนี้ฉันรู้สึกว่ามันสะอาดที่สุด:

formatters = {             
    'RED': '\033[91m',     
    'GREEN': '\033[92m',   
    'END': '\033[0m',      
}

print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)

นี่เป็นสิ่งที่ดีมากสำหรับการทำโดยไม่มีแพ็คเกจของบุคคลที่สาม
Jamie Counsell

20

สร้างคำตอบ @joeld โดยใช้https://pypi.python.org/pypi/lazyme pip install -U lazyme :

from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc

ภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่


การอัปเดตบางอย่างสำหรับcolor_printwith with formatters ใหม่เช่น:

>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter, 
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']

หมายเหตุ: การitalic, fast blinkingและstrikethroughอาจจะไม่ทำงานในอาคารทั้งหมดไม่ทำงานบน Mac / อูบุนตู

เช่น

>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar

ภาพหน้าจอ:

ป้อนคำอธิบายรูปภาพที่นี่


20
def black(text):
    print('\033[30m', text, '\033[0m', sep='')

def red(text):
    print('\033[31m', text, '\033[0m', sep='')

def green(text):
    print('\033[32m', text, '\033[0m', sep='')

def yellow(text):
    print('\033[33m', text, '\033[0m', sep='')

def blue(text):
    print('\033[34m', text, '\033[0m', sep='')

def magenta(text):
    print('\033[35m', text, '\033[0m', sep='')

def cyan(text):
    print('\033[36m', text, '\033[0m', sep='')

def gray(text):
    print('\033[90m', text, '\033[0m', sep='')


black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")

ลองออนไลน์


นี่สำหรับ python3 เท่านั้นหรือไม่ มีข้อผิดพลาดใน sep = '' กับ python2
ScipioAfricanus

ทำงานอย่างสมบูรณ์แบบใน python3 ubuntu 18.04
Julius Prayogo

18

โปรดทราบว่าwithคำหลักผสมกับตัวดัดแปลงเช่นนี้ได้อย่างไรซึ่งจำเป็นต้องรีเซ็ต (ใช้ Python 3 และ Colorama):

from colorama import Fore, Style
import sys

class Highlight:
  def __init__(self, clazz, color):
    self.color = color
    self.clazz = clazz
  def __enter__(self):
    print(self.color, end="")
  def __exit__(self, type, value, traceback):
    if self.clazz == Fore:
      print(Fore.RESET, end="")
    else:
      assert self.clazz == Style
      print(Style.RESET_ALL, end="")
    sys.stdout.flush()

with Highlight(Fore, Fore.GREEN):
  print("this is highlighted")
print("this is not")

พยายาม colorama ใช้print(Style.BRIGHT + "Header Test")และprint (Style.DIM + word)เพื่อสร้างพรอมต์ที่ดีจริงๆ
Tom

สิ่งนี้จะต้องเปลี่ยนเพื่อใช้contextlibสำหรับ Py3
แมว

@cat: คุณจำเป็นต้องใช้ Python เวอร์ชันใด
Janus Troelsen

ฉันเชื่อ 3 ขึ้นไป - มันควรจะมี@contextlib.contextmanagerมัณฑนากรกับมันหรือเปล่า?
แมว

1
@cat: ทำไม ใช้งานได้ดีโดยไม่ต้อง
Janus Troelsen

17

คุณสามารถใช้การดำเนินการ Python ของไลบรารี curses: http://docs.python.org/library/curses.html

นอกจากนี้เรียกใช้สิ่งนี้และคุณจะพบกล่องของคุณ:

for i in range(255):
    print i, chr(i)

โดยส่วนตัวแล้วฉันคิดว่าห้องสมุด 'คำสาป' ถูกบดบังโดย 'พร' ในลักษณะเดียวกับ 'คำร้องขอ' ที่มีการบดบัง 'urllib' ฯลฯ
Jonathan Hartley

17

คุณสามารถใช้ CLINT:

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')

ได้รับจาก GitHub


1
ลิงก์แรกหายไปดังนั้นฉันจึงลบออก ลิงก์ GH ยังคงดี (แม้ว่าโครงการจะ "เก็บถาวร" และถูกทอดทิ้งโดยทั่วไปจากสิ่งที่ฉันสามารถรวบรวมได้)
Giacomo Lacava

15

ฉันรู้ว่าฉันมาสาย แต่ผมมีห้องสมุดที่เรียกว่า Colorit มันง่ายมาก

นี่คือตัวอย่างบางส่วน:

from ColorIt import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
initColorIt()

# Foreground
print (color ('This text is red', colors.RED))
print (color ('This text is orange', colors.ORANGE))
print (color ('This text is yellow', colors.YELLOW))
print (color ('This text is green', colors.GREEN))
print (color ('This text is blue', colors.BLUE))
print (color ('This text is purple', colors.PURPLE))
print (color ('This text is white', colors.WHITE))

# Background
print (background ('This text has a background that is red', colors.RED))
print (background ('This text has a background that is orange', colors.ORANGE))
print (background ('This text has a background that is yellow', colors.YELLOW))
print (background ('This text has a background that is green', colors.GREEN))
print (background ('This text has a background that is blue', colors.BLUE))
print (background ('This text has a background that is purple', colors.PURPLE))
print (background ('This text has a background that is white', colors.WHITE))

# Custom
print (color ("This color has a custom grey text color", (150, 150, 150))
print (background ("This color has a custom grey background", (150, 150, 150))

# Combination
print (background (color ("This text is blue with a white background", colors.BLUE), colors.WHITE))

สิ่งนี้จะช่วยให้คุณ:

รูปภาพของ ColorIt

เป็นที่น่าสังเกตว่านี่เป็นแพลตฟอร์มข้ามและได้รับการทดสอบบน mac, linux และ windows

คุณอาจต้องการลอง: https://github.com/CodeForeverAndEver/ColorIt

หมายเหตุ: การกะพริบตัวเอียงตัวหนา ฯลฯ จะถูกเพิ่มในอีกไม่กี่วัน


14

หากคุณกำลังเขียนโปรแกรมเกมบางทีคุณอาจต้องการเปลี่ยนสีพื้นหลังและใช้ช่องว่างเท่านั้น? ตัวอย่างเช่น:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"

ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้สามารถพบได้ที่นี่ - linux.byexamples.com/archives/184/…
pragmatic

11

หากคุณกำลังใช้ Windows อยู่ที่นี่แล้วคุณจะไป!

# display text on a Windows console
# Windows XP with Python27 or Python32
from ctypes import windll
# needed for Python2/Python3 diff
try:
    input = raw_input
except:
    pass
STD_OUTPUT_HANDLE = -11
stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
# look at the output and select the color you want
# for instance hex E is yellow on black
# hex 1E is yellow on blue
# hex 2E is yellow on green and so on
for color in range(0, 75):
     windll.kernel32.SetConsoleTextAttribute(stdout_handle, color)
     print("%X --> %s" % (color, "Have a fine day!"))
     input("Press Enter to go on ... ")

หากคุณต้องการสีต่างกันในบรรทัดเดียวกันให้ล้างสตรีม stdout ระหว่างการโทร:print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
user2023861

11

หากคุณใช้Django

>>> from django.utils.termcolors import colorize
>>> print colorize("Hello World!", fg="blue", bg='red',
...                 opts=('bold', 'blink', 'underscore',))
Hello World!
>>> help(colorize)

ภาพรวม:

ภาพ

(โดยทั่วไปฉันใช้เอาต์พุตสีสำหรับการดีบั๊กบนเทอร์มินัลของ runserver ดังนั้นฉันจึงเพิ่มมัน)

คุณสามารถทดสอบว่ามีการติดตั้งในเครื่องของคุณหรือไม่:
$ python -c "import django; print django.VERSION"
หากต้องการติดตั้งให้ตรวจสอบ: วิธีการติดตั้ง Django

ให้มันลอง!!


10

นี่คือตัวอย่างคำสาป:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)

รหัสของคุณล้มเหลวภายใต้ Windows (x64) โดยมีข้อผิดพลาดนี้: AttributeError: 'โมดูล' วัตถุไม่มีแอตทริบิวต์ 'wrapper'
sorin

1
@Sorin Sbarnea: เนื่องจาก python curses เอกสารอย่างเป็นทางการในdocs.python.org/library/curses.htmlโมดูล curses ไม่ได้รับการสนับสนุนบน windows บางทีคุณอาจได้รับข้อผิดพลาดนี้แทนที่จะเป็น "ไม่มีโมดูลดังกล่าว" หรืออะไรทำนองนี้เพราะคุณอาจตั้งชื่อไฟล์ทดสอบ "curses.py" เพื่อนำเข้าเอง
nosklo

10

https://raw.github.com/fabric/fabric/master/fabric/colors.py

"""
.. versionadded:: 0.9.2

Functions for wrapping strings in ANSI color codes.

Each function within this module returns the input string ``text``, wrapped
with ANSI color codes for the appropriate color.

For example, to print some text as green on supporting terminals::

    from fabric.colors import green

    print(green("This text is green!"))

Because these functions simply return modified strings, you can nest them::

    from fabric.colors import red, green

    print(red("This sentence is red, except for " + \
          green("these words, which are green") + "."))

If ``bold`` is set to ``True``, the ANSI flag for bolding will be flipped on
for that particular invocation, which usually shows up as a bold or brighter
version of the original color on most terminals.
"""


def _wrap_with(code):

    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "\033[%sm%s\033[0m" % (c, text)
    return inner

red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')

10

asciimaticsให้การสนับสนุนแบบพกพาสำหรับการสร้าง UI ข้อความและภาพเคลื่อนไหว:

#!/usr/bin/env python
from asciimatics.effects import RandomNoise  # $ pip install asciimatics
from asciimatics.renderers import SpeechBubble, Rainbow
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError


def demo(screen):
    render = Rainbow(screen, SpeechBubble('Rainbow'))
    effects = [RandomNoise(screen, signal=render)]
    screen.play([Scene(effects, -1)], stop_on_resize=True)

while True:
    try:
        Screen.wrapper(demo)
        break
    except ResizeScreenError:
        pass

Asciicast:

ข้อความสีรุ้งท่ามกลางเสียงรบกวน ASCII


10

อีกโมดูล pypi ที่ล้อมฟังก์ชันการพิมพ์ของ python 3:

https://pypi.python.org/pypi/colorprint

มันสามารถใช้งานได้ในหลาม 2.x from __future__ import printถ้าคุณยัง นี่คือตัวอย่างของ python 2 จากหน้าโมดูล pypi:

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', 'blink'])

เอาท์พุต "สวัสดีโลก!" ด้วยคำที่เป็นสีฟ้าและเครื่องหมายอัศเจรีย์สีแดงตัวหนาและกระพริบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.