Jak wydrukować kolorowy tekst w terminalu w Pythonie?

2125

Jak mogę wydrukować kolorowy tekst na terminalu w Pythonie? Jaki jest najlepszy symbol Unicode reprezentujący bryłę?

aboSamoor
źródło
6
Aby uzyskać lepsze odpowiedzi, należy podać dodatkowe informacje: wieloplatformowy? czy moduły zewnętrzne są akceptowane?
sorin
2
IPython robi to na różnych platformach. Zobacz, czego używają?
endolith,
Ten symbol byłby świetnym kolorowym blokiem: Jedynym problemem jest to, że jest on rozszerzony ASCII, być może mógłbyś go uruchomić za pomocąhttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif
Niektóre terminale mogą także wyświetlać znaki Unicode. Jeśli dotyczy to twojego terminala, możliwe postacie są prawie nieograniczone.
ayke
4
Ta odpowiedź nadeszła dość późno, ale wydaje mi się, że jest najlepsza ... te głosowane powyżej wymagają specjalnych hacków dla systemu Windows, podczas gdy ta po prostu działa: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Odpowiedzi:

1832

To nieco zależy od tego, na jakiej platformie jesteś. Najczęstszym sposobem na to jest wydrukowanie sekwencji ucieczki ANSI. Dla prostego przykładu oto kod Pythona ze skryptów kompilacji blendera :

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'

Aby użyć takiego kodu, możesz zrobić coś takiego

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

lub z Python3.6 +:

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

Będzie to działać na systemach uniksowych, w tym OS X, Linux i Windows (pod warunkiem, że używasz ANSICON lub w Windows 10, pod warunkiem, że włączysz emulację VT100 ). Istnieją kody ansi do ustawiania koloru, przesuwania kursora i nie tylko.

Jeśli zamierzasz się z tym komplikować (i brzmi to tak, jakbyś pisał grę), powinieneś zajrzeć do modułu „przekleństwa”, który obsługuje dla ciebie wiele skomplikowanych części. Python Przekleństwa HOWTO jest dobrym wstępem.

Jeśli nie używasz rozszerzonego ASCII (tj. Nie na PC), utkniesz z postaciami ascii poniżej 127, a „#” lub „@” jest prawdopodobnie najlepszym wyborem dla bloku. Jeśli możesz upewnić się, że twój terminal używa rozszerzonego zestawu znaków ascii IBM , masz o wiele więcej opcji. Znaki 176, 177, 178 i 219 są „znakami blokowymi”.

Niektóre nowoczesne programy tekstowe, takie jak „Dwarf Fortress”, emulują tryb tekstowy w trybie graficznym i wykorzystują obrazy klasycznej czcionki PC. Niektóre z tych bitmap, których możesz użyć na Dwarf Fortress Wiki, patrz ( zestawy klocków wykonane przez użytkownika ).

Tekst Tryb Demo Konkurs ma więcej środków na ten grafiki w trybie tekstowym.

Hmm .. Myślę, że trochę poniosło mnie to pytanie. Jestem jednak w trakcie planowania epickiej gry przygodowej opartej na tekście. Powodzenia z kolorowym tekstem!

joeld
źródło
Ale przypuśćmy, że mój domyślny monit nie jest czarny - czy uważasz, że po tych sztuczkach można ponownie uruchomić Pythona?
Adobe
4
W systemie Linux może chcesz używać tput, jak tak , ponieważ skutkuje bardziej przenośnego kodu.
Martin Ueding
3
@Cawas: Prawdziwym przypadkiem użycia disablejest przesyłanie danych wyjściowych do pliku; chociaż narzędzia takie catmogą obsługiwać kolory, ogólnie lepiej nie drukować informacji o kolorach w plikach.
Sebastian Mach
1
@AlexanderSimko, oto fragment kodu ctypes włączyć obsługę VT100 w systemie Windows 10: 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).
Eryk Sun,
1
Dla każdego, kto używa przykładowego kodu w Pythonie z odpowiedzi: Należy zauważyć, że kolory w zakresie 90-97 i 100-107 są niestandardowe i, na moim terminalu, nie wszystkie dają kolory wskazane przez nazwy zmiennych. Lepiej jest użyć standardowych zakresów 30–37 i 40–47. Źródło: en.wikipedia.org/wiki/…
balu
805

Dziwię się, że nikt nie wspomniał o module termcolor Pythona . Użycie jest dość proste:

from termcolor import colored

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

Lub w Python 3:

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

Jednak może nie być wystarczająco wyrafinowany do programowania gier i „kolorowych bloków”, które chcesz zrobić ...

Samat Jain
źródło
2
Ponieważ emituje kody ANSI, czy działa w systemie Windows (konsole DOS), jeśli jest załadowany ansi.sys? support.microsoft.com/kb/101875
Phil P
37
Zauważyłem, że na dzień 13.01.2011 r. Jest on teraz objęty licencją MIT
Alexander Tsepkov
12
nie ma unittests (w przeciwieństwie do colorama) i nie jest aktualizowany od 2011 r.
Janus Troelsen
5
termcolor.COLORSdaje listę kolorów
akxlr
23
W systemie Windows os.system('color')najpierw uruchom , a następnie sekwencje specjalne ANSI zaczynają działać.
Szabolcs
717

Odpowiedzią jest Colorama na wszystkie kolorowanki międzyplatformowe w Pythonie.

Przykładowy zrzut ekranu w języku Python 3.6: przykładowy zrzut ekranu

kapłan
źródło
317
Jako autor Coloramy, dziękuję za wzmiankę @ nbv4. Spróbuję wyjaśnić trochę: Colorama ma na celu pozwolić programom Python drukować kolorowy tekst terminala na wszystkich platformach, używając tych samych kodów ANSI, jak opisano w wielu innych odpowiedziach na tej stronie. W systemie Windows Colorama usuwa te znaki ANSI ze standardowego wejścia i konwertuje je na równoważne wywołania win32 dla kolorowego tekstu. Na innych platformach Colorama nic nie robi. Dlatego możesz używać kodów ANSI lub modułów, takich jak Termcolor, a dzięki Colorama „po prostu działają” na wszystkich platformach. W każdym razie to ten pomysł.
Jonathan Hartley,
2
@Jonathan, To naprawdę niesamowita biblioteka! Możliwość przechodzenia między kolorowymi danymi wyjściowymi w języku Python jest naprawdę bardzo przyjemna i przydatna. Dostarczam narzędzia do biblioteki, która pokoloruje własną konsolę. Mogę przekierować wyjście tej konsoli do terminala i pokolorować wyjście. Teraz mogę nawet zwiększyć bibliotekę i pozwolić użytkownikowi wybrać kolory. Pozwoli to osobom niewidomym na kolory ustawić rzeczy, aby działały, aby mogły właściwie widzieć wydruk. Dzięki
Demolishun,
50
Powinno to znajdować się w standardowej bibliotece ... Myślę, że obsługa kolorów na różnych platformach jest ważna.
daviewales
5
Colorama jest świetna! Zobacz także ansimarkup , który jest oparty na colorama i pozwala na użycie prostego znacznika (np. <b>bold</b>) Do dodawania stylu do tekstu terminala
gvalkov
30
To nie działa bez wywołania colorama.init (). Głosować!
Smit Johnth
427

Wydrukuj ciąg, który rozpoczyna kolor / styl, następnie ciąg, a następnie zakończ zmianę koloru / stylu za pomocą '\x1b[0m':

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

Sukces z przykładem zielonego tła

Uzyskaj tabelę opcji formatowania tekstu powłoki z następującym kodem:

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()

Przykład jasności na ciemności (kompletny)

wprowadź opis zdjęcia tutaj

Przykład ciemnego światła (częściowy)

górna część produkcji

rabin utam
źródło
8
działa to w większości powłok, jak również w ipython, wystarczająco dobre dla większości aplikacji
dashy
4
czy mogę zapytać, który to terminal?
FlipTack,
4
jak to jest przenośne?
Ruggero Turra,
2
Krótka samodzielna implementacja: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920
Jonathan H
203

Zdefiniuj ciąg rozpoczynający kolor i ciąg kończący kolor, a następnie wydrukuj tekst z ciągiem początkowym na początku i końcowym na końcu.

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

Powoduje to bash, że w urxvtschemacie kolorów w stylu Zenburn:

kolory wyjściowe

Dzięki eksperymentom możemy uzyskać więcej kolorów:

matryca kolorów

Uwaga: \33[5mi \33[6mmigają.

W ten sposób możemy stworzyć pełną kolekcję kolorów:

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'

Oto kod do wygenerowania testu:

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
qubodup
źródło
2
jak
sprawiłeś, żeby
2
Jaka powłoka lub terminal sprawia, że ​​miga?
Zypps987
1
(u) rxvt na przykład
qubodup
6
Migający tekst działa naprawdę bardzo dobrze. Jak mam to zatrzymać? Wszystkie kolejne wydruki z jakiegoś powodu migają. Mój terminal uważa, że ​​czas na imprezę!
kapitan
3
Na końcu łańcucha miga, umieszcza \33[0mlub CENDwyżej.
Stiffy2000
94

Chcesz poznać sekwencje specjalne ANSI. Oto krótki przykład:

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

Aby uzyskać więcej informacji, zobacz http://en.wikipedia.org/wiki/ANSI_escape_code

W przypadku znaku bloku wypróbuj znak Unicode, taki jak \ u2588:

print(u"\u2588")

Kładąc wszystko razem:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
Bryan Oakley
źródło
3
Spróbuj def d(*v): return '\x1B['+';'.join(map(str, v))+'m'więcprint ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
Jewgienij Siergiejew
jakie jest znaczenie resetowania tutaj?
MohitC,
71

Odpowiadam, ponieważ znalazłem sposób korzystania z kodów ANSI w systemie Windows 10, dzięki czemu możesz zmienić kolor tekstu bez żadnych modułów, które nie są wbudowane:

Linia, która sprawia, że ​​to działa os.system(""), lub dowolne inne wywołanie systemowe, które pozwala wydrukować kody ANSI w terminalu:

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!")

Uwaga: Chociaż daje to te same opcje, co inne opcje systemu Windows, system Windows nie obsługuje w pełni kodów ANSI, nawet przy tej sztuczce. Nie wszystkie kolory dekoracji tekstu działają, a wszystkie „jasne” kolory (kody 90–97 i 100–107) wyświetlają się tak samo jak zwykłe kolory (kody 30–37 i 40–47)

Edycja : Dzięki @jl za znalezienie jeszcze krótszej metody.

tl; dr : Dodaj os.system("")w górnej części pliku.

Wersja Python: 3.6.7

SimpleBinary
źródło
2
To działa - jestem naprawdę zaskoczony, że polecenie koloru włącza kody ANSI w terminalu Windows, przeszedłem przez lata, nie wiedząc, że to możliwe - samo polecenie nie daje żadnych wskazówek, że to robi.
Stuart Axon
1
Najprostszy i działa idealnie. Dzięki.
Ari
3
Żeby było jasne, zadziała to tylko w systemie Windows 10.
Anaksunaman
2
Nie działa w systemie Windows 7 / 8.1.
Nikos
2
Bardzo dziękuję za odpowiedź, @ SimpleBinary! Rozważając swoją odpowiedź, odkryłem, że możesz uprościć if sys.platform.lower() == "win32": os.system('color')jeszcze bardziej, po prostu zastępując ją just os.system(''). Nie jest wymagany żaden warunek, a kod działa zarówno w systemie Windows 10, jak i Linux (kiedy go testowałem). Jak widać, nie musisz wykonywać połączenia systemowego z color. Domaga się dir, cd, abcdef, i po prostu pusta porządku praca string (chociaż niepuste ciągi najprawdopodobniej wydrukować wyjście nie chcesz, aby zobaczyć).
JL
60

Moim ulubionym sposobem jest biblioteka Blessings (pełne ujawnienie: napisałem to). Na przykład:

from blessings import Terminal

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

Aby wydrukować kolorowe cegły, najbardziej niezawodnym sposobem jest wydrukowanie przestrzeni w kolorach tła. Używam tej techniki do rysowania paska postępu progresywnie :

print t.on_green(' ')

Możesz również drukować w określonych lokalizacjach:

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

Jeśli w trakcie gry będziesz musiał zmarnować inne możliwości terminalu, możesz to zrobić. Możesz użyć standardowego formatowania napisów w Pythonie, aby zachować jego czytelność:

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

Zaletą Blessings jest to, że najlepiej działa na wszelkiego rodzaju terminalach, nie tylko na (przeważnie powszechnych) kolorach ANSI. Utrzymuje również nieczytelne sekwencje specjalne poza twoim kodem, pozostając jednocześnie zwięzłym w użyciu. Baw się dobrze!

Erik Rose
źródło
65
Umieszczenie koloru jako nazwy funkcji, a nie jako parametru, jest wątpliwą praktyką.
LtWorf,
1
@LtWorf: możesz łatwo ustawić go jako parametr, getattrjeśli potrzebujesz. Lub bardziej prawdopodobne, po prostu dynamicznie utwórz ciąg formatu.
jfs
8
@progo fakt, że możesz to zrobić, nie oznacza, że ​​powinieneś to zrobić. Jest bardziej ogólny, jeśli kolor jest parametrem, który można po prostu przekazać.
LtWorf
2
Jesteś can just passfunkcją python.
MaxNoe
2
Pamiętaj, że importowanie błogosławieństw nie działa w systemie Windows, więc nie używaj go, jeśli twój skrypt musi być wieloplatformowy.
Adversus
58

sty jest podobny do colorama, ale jest mniej gadatliwy, obsługuje kolory 8bit i 24bit (rgb), pozwala zarejestrować własne style, obsługuje wyciszanie, jest naprawdę elastyczny, dobrze udokumentowany i więcej.

Przykłady:

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')

drukuje:

wprowadź opis zdjęcia tutaj

Próbny: wprowadź opis zdjęcia tutaj

Rotareti
źródło
7
Byłoby to bardzo przydatne, jeśli weźmiesz pod uwagę porównanie z colorama, wolę twoją bibliotekę, ale tylko dlatego, że krótsze API z pudełka, i byłoby świetnie, gdyby był bardziej popularny. Dzięki!
Victor Gavro,
Lubię sty i próbuję sformatować ciąg za pomocą sty, jednym z problemów jest to, że kiedy drukuję wiele kolorów, czy mogę przywrócić poprzedni kolor zamiast domyślnego?
intijk
@VictorGavro To dobry pomysł! Mogę dodać porównanie do dokumentacji.
Rotareti
@intijk Twoje pytanie nie pasuje do sekcji komentarzy. W przypadku tego rodzaju pytań utwórz nowe pytanie SO lub użyj narzędzia do śledzenia problemów github.
Rotareti
53

wygenerował klasę ze wszystkimi kolorami za pomocą pętli for, aby iterować każdą kombinację kolorów do 100, a następnie napisał klasę z kolorami python. Skopiuj i wklej, jak chcesz, GPLv2 przeze mnie:

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'
GI Jack
źródło
44

Wypróbuj ten prosty kod

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")
dayitv89
źródło
19
Sugestia: zdefiniuj lambdy, które zwracają ten kolorowy ciąg, zamiast drukować je bezpośrednio, aby można go było używać w połączeniu z innymi ciągami.
gustafbstrom
34

W systemie Windows można użyć modułu „win32console” (dostępnego w niektórych dystrybucjach Pythona) lub modułu „ctypes” (Python 2.5 i nowsze), aby uzyskać dostęp do Win32 API.

Aby zobaczyć pełny kod, który obsługuje oba sposoby, zobacz kod raportowania konsoli kolorów od Testoob .

przykład 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)
orip
źródło
2
Szczerze mówiąc, jest to jedyne rozwiązanie, które działa z systemem Windows. Wszystkie pozostałe odpowiedzi są po prostu kopią innych.
Danilo,
FWIW, w systemie Windows korzystanie z ConEmu obsługującego sekwencje ANSI może być mniej uciążliwe (oprócz wielu innych zalet w stosunku do terminala natywnego). Nadal świetnie jest mieć natywne rozwiązanie.
Endre Both
Jestem z Danilo.
Muhammad Ali
24

Głupio prosta w oparciu o odpowiedź @ 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)

Więc po prostu

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
zahanm
źródło
2
To się zawiesi, jeśli przekażesz więcej niż jeden argument pozycyjny lub cokolwiek innego niż ciąg znaków
Romain Vincent
@RainainVincent Więc nie przekazuj więcej niż jednego argumentu pozycyjnego lub czegokolwiek innego niż ciąg ty - czekaj, to są print-replacements ? Sprzeciw został odwołany.
wizzwizz4
1
@ wizzwizz4 Nie jestem pewien, co miałeś na myśli z tym komentarzem, i tak nie widzę sensu. Jeśli zamierzasz zaproponować klasę ..., aby zastąpić metodę tak prostą jak print, równie dobrze możesz uniknąć uczynienia jej tak łatwą do złamania. Tylko moja opinia.
Romain Vincent
1
@RainainVincent Miałem zamiar powiedzieć, że twój sprzeciw był błędny, ale w zamian za funkcję tak wszechstronną, jak printnależy, należy upewnić się, że odpowiednio ją replikuje.
wizzwizz4
1
@RomainVincent Implementuje użycie nieskończonych argumentów: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</code>
Emilien Baudet
23

Zawarłem @joeld odpowiedź w module z funkcjami globalnymi, których mogę używać w dowolnym miejscu w kodzie.

plik: 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

użyj w następujący sposób:

 import log
    log.info("Hello World")
    log.err("System Error")
Mohamed Samy
źródło
22

W systemie Windows nie można drukować na konsoli za pomocą kolorów, chyba że używasz win32api.

W przypadku Linuksa jest to tak proste, jak użycie print, z sekwencjami ucieczki opisanymi tutaj:

Zabarwienie

Aby postać drukowała się jak pudełko, tak naprawdę zależy od tego, jakiej czcionki używasz w oknie konsoli. Symbol funta działa dobrze, ale zależy to od czcionki:

#
UberJumper
źródło
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))

Tekst ze zmieniającym się planem i tłem, kolory 0..141 Tekst ze zmieniającym się planem i tłem, kolory 142..255

Andriy Makukha
źródło
20

Skończyło się na tym, czułem, że to było najczystsze:

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)
Ben174
źródło
Jest to naprawdę miłe, jeśli robisz to bez pakietu innej firmy.
Jamie Counsell,
20

Opierając się na odpowiedzi @joeld, używając 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

Zrzut ekranu:

wprowadź opis zdjęcia tutaj


Niektóre aktualizacje color_printnowych formatów, np .:

>>> 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']

Uwaga: italic, fast blinkinga strikethroughmoże nie działać na wszystkich terminalach, nie działa na Mac / Ubuntu.

Na przykład

>>> 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

Zrzut ekranu:

wprowadź opis zdjęcia tutaj

alvas
źródło
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")

Wypróbuj online

Vishal
źródło
Czy to dotyczy tylko Python3? dostał błąd na sep = '' z python2
ScipioAfricanus
działa idealnie w python3 ubuntu 18.04
Julius Prayogo
18

zwróć uwagę, jak dobrze withsłowo kluczowe miesza się z takimi modyfikatorami, które muszą zostać zresetowane (przy użyciu Python 3 i 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")
Janus Troelsen
źródło
Wypróbowałem colorama, wykorzystałem print(Style.BRIGHT + "Header Test")i print (Style.DIM + word)stworzyłem naprawdę fajny monit.
Tom
Trzeba będzie zmienić, aby używać contextlibPy3.
kot
@cat: Z jakiej wersji Python będzie to konieczne?
Janus Troelsen
Wierzę 3 i więcej - powinien mieć @contextlib.contextmanagerdekoratora, nie?
kot
1
@cat: Dlaczego? Działa świetnie bez.
Janus Troelsen
17

Możesz użyć implementacji biblioteki curses w języku Python: http://docs.python.org/library/curses.html

Uruchom także, a znajdziesz swoje pudełko:

for i in range(255):
    print i, chr(i)
Daharon
źródło
Osobiście uważam, że biblioteka „klątw” została całkowicie przyćmiona przez „błogosławieństwa”, w ten sam sposób, w jaki „prośby” przyćmiły „urllib” itp.
Jonathan Hartley
17

Możesz użyć CLINT:

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

Pobierz z GitHub .

Giacomo Lacava
źródło
1
Pierwszy link zniknął, więc go usunąłem; łącze GH jest nadal dobre (chociaż projekt jest „archiwizowany” i zasadniczo porzucony, z tego, co mogę zebrać).
Giacomo Lacava
15

Wiem, że się spóźniłem. Ale mam bibliotekę o nazwie ColorIt . To jest bardzo proste.

Oto kilka przykładów:

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))

To daje ci:

Zdjęcie ColorIt

Warto również zauważyć, że jest to platforma wieloplatformowa i została przetestowana na systemach Mac, Linux i Windows.

Możesz spróbować: https://github.com/CodeForeverAndEver/ColorIt

Uwaga: miganie, kursywa, pogrubienie itp. Zostaną dodane za kilka dni.

BeastCoder
źródło
14

Jeśli programujesz grę, być może chciałbyś zmienić kolor tła i używać tylko spacji? Na przykład:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"
suhib-alsisan
źródło
Więcej na ten temat można znaleźć tutaj
pragmatyczny
11

Jeśli korzystasz z systemu Windows, proszę bardzo!

# 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 ... ")
Navweb
źródło
Jeśli chcesz mieć różne kolory na tej samej linii, print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
opróżnij standardowy
11

Jeśli używasz Django

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

migawka:

wizerunek

(Generalnie używam kolorowych wyników do debugowania na terminalu runserver, więc go dodałem).

Możesz przetestować, czy jest zainstalowany na twoim komputerze:
$ python -c "import django; print django.VERSION"
Aby zainstalować, sprawdź: Jak zainstalować Django

Spróbuj!!

Grijesh Chauhan
źródło
10

Oto przykład przekleństwa:

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)
nosklo
źródło
Twój kod nie działa w systemie Windows (x64) z tym błędem: AttributeError: Obiekt „module” nie ma atrybutu „otoki”
sorin
1
@Sorin Sbarnea: Zgodnie z oficjalną dokumentacją Python Curses w docs.python.org/library/curses.html moduł curses nie jest obsługiwany w systemie Windows. Być może dostałeś ten błąd zamiast „Brak takiego modułu” lub coś w tym rodzaju, ponieważ prawdopodobnie nazwałeś swój plik testowy „curses.py”, więc się importuje.
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')
Vishal
źródło
10

asciimatics zapewnia przenośne wsparcie dla tworzenia tekstowego interfejsu użytkownika i animacji:

#!/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:

tekst w kolorze tęczy wśród ascii noise

jfs
źródło
10

Jeszcze inny moduł pypi, który otacza funkcję drukowania Python 3:

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

Jest użyteczny w Pythonie 2.x, jeśli Ty również from __future__ import print. Oto przykład python 2 ze strony pypi modułów:

from __future__ import print_function
from colorprint import *

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

Wyjścia „Witaj, świecie!” ze słowami w kolorze niebieskim i wykrzyknikiem pogrubionym czerwonym i migającym.

drevicko
źródło