Come stampare testo colorato nel terminale in Python?


2132

Come posso inviare testo colorato al terminale, in Python? Qual è il miglior simbolo Unicode per rappresentare un blocco solido?


7
Dovresti specificare alcune informazioni aggiuntive per ottenere risposte migliori: multipiattaforma? sono accettati moduli esterni?
sorin,

2
IPython lo fa, multipiattaforma. Vedi cosa usano?
endolith

Questo simbolo creerebbe un grande blocco colorato: l' unico problema è che è esteso ASCII, forse potresti farlo funzionare usandohttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif,

Alcuni terminali possono anche visualizzare caratteri Unicode. Se questo è vero per il tuo terminale, i possibili caratteri sono quasi illimitati.
ayke,

4
Questa risposta è arrivata abbastanza tardi, ma sembra essere la migliore per me ... quelli hanno votato sopra di esso richiede hack speciali per Windows, mentre questo funziona solo: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Risposte:


1836

Questo dipende in qualche modo dalla piattaforma su cui ti trovi. Il modo più comune per farlo è stampare le sequenze di escape ANSI. Per un semplice esempio, ecco un po 'di codice Python dagli script di build di Blender :

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'

Per usare un codice come questo, puoi fare qualcosa del genere

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

oppure, con Python3.6 +:

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

Funzionerà su unix tra cui OS X, Linux e Windows (a condizione che tu usi ANSICON , o in Windows 10 a condizione che tu abiliti l' emulazione VT100 ). Esistono codici ansi per l'impostazione del colore, lo spostamento del cursore e altro.

Se hai intenzione di complicarti con questo (e sembra che tu stia scrivendo un gioco), dovresti esaminare il modulo "maledizioni", che gestisce molte delle parti complicate di questo per te. Il Python Curses HowTO è una buona introduzione.

Se non stai usando ASCII esteso (cioè non su un PC), sei bloccato con i caratteri ASCII inferiori a 127 e '#' o '@' è probabilmente la soluzione migliore per un blocco. Se puoi assicurarti che il tuo terminale stia utilizzando un set di caratteri ASCII esteso IBM , hai molte più opzioni. I caratteri 176, 177, 178 e 219 sono i "caratteri di blocco".

Alcuni moderni programmi basati su testo, come "Dwarf Fortress", emulano la modalità testo in modalità grafica e usano immagini del classico font per PC. Puoi trovare alcune di queste bitmap che puoi usare sul Wiki di Dwarf Fortress ( set di tessere create dall'utente ).

Il Contest Demo in modalità testo ha più risorse per realizzare grafica in modalità testo.

Hmm .. Penso che mi sia lasciato un po 'trasportare da questa risposta. Sono nel bel mezzo della pianificazione di un epico gioco di avventura basato su testo, però. Buona fortuna con il tuo testo colorato!


Ma supponiamo che il mio prompt predefinito non sia nero - pensi che sia possibile resotre Python dopo questi trucchi?
Adobe

4
Su Linux, potresti voler usare tput, in questo modo poiché risulta in un codice più portatile.
Martin Ueding,

3
@Cawas: un caso d'uso reale disableè quando si esegue il pipe dell'output in un file; mentre strumenti come catpossono supportare i colori, è generalmente meglio non stampare informazioni sui colori sui file.
Sebastian Mach,

1
@AlexanderSimko, ecco un frammento di codice ctypes per abilitare il supporto VT100 in 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
A chiunque utilizzi il codice di esempio di Python dalla risposta: Va notato che i colori nell'intervallo 90-97 e 100-107 sono non standard e, in effetti, sul mio terminale non tutti danno i colori indicati dal nomi di variabili. È meglio usare le gamme standard 30-37 e 40-47. Fonte: en.wikipedia.org/wiki/…
balu

807

Sono sorpreso che nessuno abbia menzionato il modulo termcolor Python . L'utilizzo è piuttosto semplice:

from termcolor import colored

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

O in Python 3:

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

Potrebbe non essere abbastanza sofisticato, tuttavia, per la programmazione di gioco e i "blocchi colorati" che vuoi fare ...


2
Poiché emette codici ANSI, funziona su Windows (console DOS) se ansi.sys è caricato? support.microsoft.com/kb/101875
Phil P

37
Ho appena notato che dal 13/01/2011, ora è sotto licenza MIT
Alexander Tsepkov,

12
non ha unittest (a differenza di colorama) e non aggiornato dal 2011
Janus Troelsen,

5
termcolor.COLORSti dà un elenco di colori
akxlr

23
Su Windows eseguire os.system('color')prima, quindi le sequenze di escape ANSI iniziano a funzionare.
Szabolcs,

717

La risposta è Colorama per tutte le colorazioni multipiattaforma in Python.

Uno screenshot di esempio di Python 3.6: screenshot di esempio


317
Come autore di Colorama, grazie per la menzione @ nbv4. Cercherò di chiarire un po ': Colorama mira a consentire ai programmi Python di stampare testi terminali colorati su tutte le piattaforme, utilizzando gli stessi codici ANSI descritti in molte altre risposte in questa pagina. Su Windows, Colorama rimuove questi caratteri ANSI da stdout e li converte in equivalenti chiamate win32 per il testo colorato. Su altre piattaforme, Colorama non fa nulla. Quindi è possibile utilizzare codici ANSI o moduli come Termcolor e con Colorama "funzionano" su tutte le piattaforme. È questa idea, comunque.
Jonathan Hartley,

2
@Jonathan, Questa è davvero una libreria fantastica! La capacità di incrociare l'output Python a colori della piattaforma è davvero piacevole e utile. Sto fornendo strumenti per una libreria che colora la propria console. Posso reindirizzare l'output di quella console al terminale e colorare l'output. Ora posso persino selezionarne uno nella libreria e consentire all'utente di selezionare i colori. Ciò consentirà alle persone daltoniche di impostare le cose in modo che possano effettivamente vedere correttamente l'output. Grazie
Demolishun,

50
Questo dovrebbe essere nella libreria standard ... Il supporto cromatico multipiattaforma è importante, credo.
daviewales,

5
Colorama è fantastico! Dai un'occhiata anche a ansimarkup , che si basa su colorama e ti consente di utilizzare un semplice markup basato su tag (ad es. <b>bold</b>) Per aggiungere stile al testo del terminale
gvalkov,

30
Questo non funziona senza chiamare colorama.init (). Vota!
Smit Johnth,

428

Stampa una stringa che inizia un colore / stile, quindi la stringa, quindi termina la modifica di colore / stile con '\x1b[0m':

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

Successo con esempio di sfondo verde

Ottieni una tabella di opzioni di formato per il testo della shell con il seguente codice:

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

Esempio chiaro-scuro (completo)

inserisci qui la descrizione dell'immagine

Esempio scuro-chiaro (parziale)

parte superiore dell'output


8
funziona nella maggior parte delle shell e in ipython, abbastanza buono per la maggior parte delle applicazioni
dashesy

4
posso chiedere, quale terminale è questo?
FlipTack

4
quanto è portatile?
Ruggero Turra,


203

Definisci una stringa che inizia un colore e una stringa che termina il colore, quindi stampa il testo con la stringa iniziale nella parte anteriore e la stringa finale alla fine.

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

Questo produce quanto segue bash, in urxvtcon una combinazione di colori in stile Zenburn:

colori di uscita

Attraverso la sperimentazione, possiamo ottenere più colori:

matrice di colore

Nota: \33[5me \33[6mlampeggiano.

In questo modo possiamo creare una collezione a colori:

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'

Ecco il codice per generare il test:

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
come hai fatto lampeggiare txt
WiLL_K

2
Quale shell o terminale fa lampeggiare?
Zypps987,

1
(u) ad esempio rxvt
qubodup,

6
Il testo lampeggiante funziona davvero molto bene. Come posso fermarlo però? Tutte le stampe consecutive lampeggiano per qualche motivo. Il mio terminale pensa che sia l'ora della festa!
capitano

3
Alla fine della stringa di lampeggiare, mettere \33[0mo CENDsopra.
Stiffy2000,

94

Vuoi conoscere le sequenze di escape ANSI. Ecco un breve esempio:

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

Per maggiori informazioni vedi http://en.wikipedia.org/wiki/ANSI_escape_code

Per un personaggio a blocchi, prova un personaggio unicode come \ u2588:

print(u"\u2588")

Mettere tutto insieme:

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

3
Prova def d(*v): return '\x1B['+';'.join(map(str, v))+'m'quindiprint ' '.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 il

qual è il significato di reset qui?
MohitC,

72

Sto rispondendo perché ho scoperto un modo per utilizzare i codici ANSI su Windows 10, in modo che tu possa cambiare il colore del testo senza moduli che non sono integrati:

La linea che fa funzionare questo è os.system(""), o qualsiasi altra chiamata di sistema, che consente di stampare codici ANSI nel Terminale:

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

Nota: sebbene ciò fornisca le stesse opzioni di altre opzioni di Windows, Windows non supporta completamente i codici ANSI, anche con questo trucco. Non tutti i colori della decorazione del testo funzionano e tutti i colori "luminosi" (Codici 90-97 e 100-107) mostrano lo stesso colore dei colori normali (Codici 30-37 e 40-47)

Modifica : grazie a @jl per aver trovato un metodo ancora più breve.

tl; dr : aggiungi os.system("")nella parte superiore del file.

Versione Python: 3.6.7


2
Funziona - Sono davvero sorpreso che il comando color abiliti i codici ANSI nel terminale di Windows, ci vado da anni senza sapere che questo era possibile - il comando stesso non fornisce alcun indizio che lo faccia.
Stuart Axon,

1
Più semplice e funziona perfettamente. Grazie.
Ari,

3
Per essere chiari, questo funzionerà solo su Windows 10.
Anaksunaman

2
Non funziona in Windows 7 / 8.1.
Nikos

2
Grazie mille per la tua risposta, @SimpleBinary! Giocando con la tua risposta, ho scoperto che puoi semplificare if sys.platform.lower() == "win32": os.system('color')ulteriormente semplicemente sostituendolo con just os.system(''). Non è necessaria alcuna condizione e il codice viene eseguito sia in Windows 10 che in Linux (quando l'ho provato). Come puoi vedere, non è necessario effettuare una chiamata di sistema a color. Chiede a dir, cd, abcdef, e solo un lavoro di stringa vuota bene (anche se le stringhe non vuote probabilmente stampare l'output non si vuole vedere).
JL

60

Il mio modo preferito è con la biblioteca Blessings (divulgazione completa: l'ho scritto). Per esempio:

from blessings import Terminal

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

Per stampare mattoni colorati, il modo più affidabile è stampare spazi con colori di sfondo. Uso questa tecnica per disegnare la barra di avanzamento in modo progressivo :

print t.on_green(' ')

Puoi stampare anche in posizioni specifiche:

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

Se devi confondere con altre funzionalità del terminale nel corso del gioco, puoi farlo anche tu. Puoi usare la formattazione standard delle stringhe di Python per mantenerla leggibile:

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

La cosa bella di Blessings è che fa del suo meglio per lavorare su tutti i tipi di terminali, non solo su quelli (straordinariamente comuni) di colore ANSI. Mantiene anche sequenze di escape illeggibili dal tuo codice pur rimanendo conciso da usare. Divertiti!


65
Mettere il colore come nome di funzione e non come parametro è una pratica discutibile.
Ten

1
@LtWorf: potresti facilmente renderlo un parametro usando getattrse ne hai bisogno. O più probabilmente, basta creare la stringa di formato in modo dinamico invece.
jfs,

8
@progo il fatto che tu possa farlo non significa che dovresti farlo. È più generico se il colore è un parametro che puoi semplicemente passare.
Tenworf,

2
Sei can just passuna funzione Python.
MaxNoe,

2
Nota che l'importazione delle benedizioni non funziona su Windows, quindi non utilizzarla se lo script deve essere multipiattaforma.
Adversus,

58

porcile è simile a colorama, ma è meno dettagliato, supporta colori a 8 bit e 24 bit (rgb), consente di registrare i propri stili, supporta il muting, è davvero flessibile, ben documentato e altro ancora.

Esempi:

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

stampe:

inserisci qui la descrizione dell'immagine

demo: inserisci qui la descrizione dell'immagine


7
Sarebbe molto utile se consideri di confrontarlo con colorama, preferisco la tua libreria, ma solo perché api più corto dalla scatola, e sarebbe bello se sarà più popolare. Grazie!
Victor Gavro,

Mi piace porcile e sto cercando di formattare la mia stringa con porcile, un problema è che, quando stampo più colori, posso ripristinare il colore precedente anziché il colore predefinito?
Intijk,

@VictorGavro Questa è una buona idea! Posso aggiungere un confronto alla documentazione.
Rotareti,

@intijk La tua domanda non si adatta alla sezione dei commenti. Per questo tipo di domanda, creare una nuova domanda SO o utilizzare il tracker del problema github.
Rotareti,

53

ha generato una classe con tutti i colori usando un ciclo for per iterare ogni combinazione di colore fino a 100, quindi ha scritto una classe con colori pitone. Copia e incolla come vuoi, GPLv2 da me:

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

Prova questo semplice codice

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
Suggerimento: definire lambdas che restituisce quella stringa colorata, invece di stamparle direttamente, in modo che possa essere utilizzata insieme ad altre stringhe.
gustafbstrom,

34

Su Windows è possibile utilizzare il modulo 'win32console' (disponibile in alcune distribuzioni Python) o il modulo 'ctypes' (Python 2.5 e versioni successive) per accedere all'API Win32.

Per vedere il codice completo che supporta entrambi i modi, vedere il codice di report della console colori di Testoob .

esempio di tipi:

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
Onestamente questa è l'unica soluzione che funziona con Windows. Tutte le altre risposte sono solo copie di ciascuno.
Danilo,

FWIW, su Windows potrebbe essere meno doloroso usare ConEmu che supporta le sequenze ANSI (a parte una serie di altri vantaggi rispetto al terminale nativo). Comunque è fantastico avere una soluzione nativa.
Endre Both,

Sono con Danilo.
Muhammad Ali

24

Stupidamente semplice basato sulla risposta di @ 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)

Quindi basta

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

2
Questo si bloccherà se passi più di un argomento posizionale o qualcosa di diverso da un tipo di stringa
Romain Vincent

@RomainVincent Quindi non passare più di un argomento posizionale o qualcosa di diverso da una stringa ty— aspetta, queste sono print-locuzioni ? Obiezione annullata.
wizzwizz4,

1
@ wizzwizz4 Non sono sicuro di cosa intendevi con questo commento, non vedo comunque il punto. Se hai intenzione di proporre una classe ..., per sostituire un metodo semplice come la stampa, potresti anche evitare di renderlo così facilmente frangibile. Solo la mia opinione.
Romain Vincent,

1
@RomainVincent Stavo per dire che la tua obiezione era sbagliata, ma per aver sostituito una funzione tanto versatile quanto printdovresti assicurarti di replicare correttamente la sua funzionalità.
wizzwizz4,

1
@RomainVincent Implementa per usare infiniti argomenti: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</code>
Emilien Baudet

23

Ho racchiuso la risposta @joeld in un modulo con funzioni globali che posso usare ovunque nel mio codice.

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

utilizzare come segue:

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

22

Per Windows non è possibile stampare su console con colori a meno che non si utilizzi win32api.

Per Linux è semplice come usare print, con le sequenze di escape descritte qui:

Colori

Per il personaggio da stampare come una scatola, dipende davvero dal tipo di carattere che stai usando per la finestra della console. Il simbolo della sterlina funziona bene, ma dipende dal carattere:

#

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

Testo con alterazione di primo piano e sfondo, colori 0..141 Testo con alterazione di primo piano e sfondo, colori 142..255


20

Ho finito per farlo, ho sentito che era il più pulito:

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)

Questo è davvero bello per farlo senza un pacchetto di terze parti.
Jamie Counsell,

20

Partendo dalla risposta @joeld, usando 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

Immagine dello schermo:

inserisci qui la descrizione dell'immagine


Alcuni aggiornamenti color_printcon i nuovi formattatori, ad esempio:

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

Nota: italic, fast blinkinge strikethroughpotrebbe non funzionare su tutti i terminali, non funziona su Mac / Ubuntu.

Per esempio

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

Immagine dello schermo:

inserisci qui la descrizione dell'immagine


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

Prova online


È solo per python3? ha ricevuto un errore su sep = '' con python2
ScipioAfricanus l'

perfettamente funzionante in Ubuntu 18.04
python3

18

nota quanto bene la withparola chiave si mescola con modificatori come questi che devono essere resettati (usando Python 3 e 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 provato, usato print(Style.BRIGHT + "Header Test")e print (Style.DIM + word)per creare un prompt davvero bello.
Tom,

Questo dovrà cambiare per usare contextlibper Py3.
gatto

@cat: da quale versione di Python sarà necessario?
Janus Troelsen,

Credo che 3 in su - dovrebbe avere un @contextlib.contextmanagerdecoratore, no?
gatto

1
@cat: perché? Funziona alla grande senza.
Janus Troelsen,

17

Puoi usare l'implementazione Python della libreria curses: http://docs.python.org/library/curses.html

Inoltre, esegui questo e troverai la tua scatola:

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

Personalmente penso che la biblioteca delle "maledizioni" sia stata totalmente eclissata da "benedizioni", allo stesso modo in cui "richieste" ha eclissato "urllib", ecc.
Jonathan Hartley

17

Puoi usare CLINT:

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

Scarica da GitHub .


1
Il primo collegamento è andato, quindi l'ho rimosso; il link GH è ancora buono (anche se il progetto è "archiviato" e sostanzialmente abbandonato, da quello che posso raccogliere).
Giacomo Lacava,

15

So di essere in ritardo. Ma ho una biblioteca chiamata ColorIt . È super semplice.

Ecco alcuni esempi:

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

Questo ti dà:

Immagine di ColorIt

Vale anche la pena notare che questo è multipiattaforma ed è stato testato su Mac, Linux e Windows.

Potresti provare: https://github.com/CodeForeverAndEver/ColorIt

Nota: lampeggiante, corsivo, grassetto, ecc. Verranno aggiunti tra qualche giorno.



11

Se stai usando Windows, allora eccoti qui!

# 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 ... ")

Se vuoi colori diversi sulla stessa linea, scarica lo stream stdout tra le chiamate:print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
user2023861

11

Se stai usando Django

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

snapshot:

Immagine

(In genere utilizzo l'output colorato per il debug sul terminale di Runtime Server, quindi l'ho aggiunto.)

Puoi verificare se è installato sul tuo computer:
$ python -c "import django; print django.VERSION"
Per installarlo controlla: Come installare Django

Provaci!!


10

Ecco un esempio di maledizioni:

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)

Il tuo codice non riesce in Windows (x64) con questo errore: AttributeError: l'oggetto 'module' non ha attributi 'wrapper'
sorin

1
@Sorin Sbarnea: secondo la documentazione ufficiale delle maledizioni di Python in docs.python.org/library/curses.html , il modulo delle maledizioni non è supportato su Windows. Forse hai ricevuto questo errore invece di "No Such Module" o qualcosa del genere, perché probabilmente hai chiamato il tuo file di test "curses.py", quindi si sta importando da solo.
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 fornisce un supporto portatile per la creazione di UI di testo e animazioni:

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

testo color arcobaleno tra rumore ascii


10

Ancora un altro modulo pypi che avvolge la funzione di stampa di python 3:

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

E 'utilizzabile in python 2.x se anche from __future__ import print. Ecco un esempio di Python 2 dalla pagina pypi dei moduli:

from __future__ import print_function
from colorprint import *

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

Output "Ciao, mondo!" con le parole in blu e il punto esclamativo in grassetto rosso e lampeggiante.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.