Wie drucke ich farbigen Text im Terminal in Python?

2127

Wie kann ich in Python farbigen Text an das Terminal ausgeben? Was ist das beste Unicode-Symbol für einen Volumenblock?

aboSamoor
quelle
6
Sie sollten einige zusätzliche Informationen angeben, um bessere Antworten zu erhalten: Multiplattform? Werden externe Module akzeptiert?
Sorin
2
IPython macht es plattformübergreifend. Sehen Sie, was sie verwenden?
Endolith
Dieses Symbol würde einen großen farbigen Block ergeben: Das einzige Problem ist, dass es ASCII-erweitert ist. Vielleicht könnten Sie es zum Laufen bringen mithttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif
Einige Terminals können auch Unicode-Zeichen anzeigen. Wenn dies für Ihr Terminal zutrifft, sind die möglichen Zeichen nahezu unbegrenzt.
Ayke
4
Diese Antwort kam ziemlich spät, aber es scheint mir die beste zu sein ... die oben genannten erfordern spezielle Hacks für Windows, während diese nur funktioniert: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Antworten:

1834

Dies hängt etwas davon ab, auf welcher Plattform Sie sich befinden. Der häufigste Weg, dies zu tun, ist das Drucken von ANSI-Escape-Sequenzen. Als einfaches Beispiel finden Sie hier einige Python-Codes aus den Blender-Build-Skripten :

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'

Um solchen Code zu verwenden, können Sie so etwas tun

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

oder mit Python3.6 +:

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

Dies funktioniert unter Unixen wie OS X, Linux und Windows (vorausgesetzt, Sie verwenden ANSICON oder in Windows 10, sofern Sie die VT100-Emulation aktivieren ). Es gibt Ansi-Codes zum Einstellen der Farbe, Bewegen des Cursors und mehr.

Wenn Sie damit kompliziert werden (und es klingt so, als ob Sie ein Spiel schreiben), sollten Sie sich das Modul "Flüche" ansehen, das viele der komplizierten Teile davon für Sie behandelt. Das Python Curses HowTO ist eine gute Einführung.

Wenn Sie kein erweitertes ASCII verwenden (dh nicht auf einem PC), bleiben Sie bei den ASCII-Zeichen unter 127 hängen, und '#' oder '@' ist wahrscheinlich die beste Wahl für einen Block. Wenn Sie sicherstellen können, dass Ihr Terminal einen erweiterten IBM ASCII-Zeichensatz verwendet , haben Sie viele weitere Optionen. Die Zeichen 176, 177, 178 und 219 sind die "Blockzeichen".

Einige moderne textbasierte Programme wie "Dwarf Fortress" emulieren den Textmodus in einem grafischen Modus und verwenden Bilder der klassischen PC-Schriftart. Einige dieser Bitmaps, die Sie verwenden können, finden Sie im Zwergenfestungs-Wiki ( benutzerdefinierte Kachelsätze ).

Der Demo-Wettbewerb im Textmodus bietet mehr Ressourcen für die Erstellung von Grafiken im Textmodus.

Hmm .. Ich denke, diese Antwort hat mich ein wenig mitgerissen. Ich bin jedoch gerade dabei, ein episches textbasiertes Abenteuerspiel zu planen. Viel Glück mit Ihrem farbigen Text!

Joeld
quelle
Angenommen, meine Standardaufforderung ist nicht schwarz. Glauben Sie, dass es nach diesen Tricks möglich ist, Python-Resotre zu erstellen?
Adobe
4
Unter Linux können Sie verwenden möchten tput, wie so da es in mehr portablen Code führt.
Martin Ueding
3
@Cawas: Ein realer Anwendungsfall disableist, wenn Sie die Ausgabe in eine Datei leiten . Während Tools wie catFarben unterstützen können, ist es im Allgemeinen besser, keine Farbinformationen in Dateien zu drucken.
Sebastian Mach
1
@AlexanderSimko, hier ist ein ctypes-Code-Snippet, um die VT100-Unterstützung in Windows 10 zu aktivieren : 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
Für alle, die den Python-Beispielcode aus der Antwort verwenden: Es sollte beachtet werden, dass die Farben im Bereich von 90-97 und 100-107 nicht dem Standard entsprechen und in der Tat auf meinem Terminal nicht alle die durch die angegebenen Farben angeben Variablennamen. Es ist besser, die Standardbereiche 30-37 und 40-47 zu verwenden. Quelle: en.wikipedia.org/wiki/…
balu
807

Ich bin überrascht, dass niemand das Python-Termcolor-Modul erwähnt hat . Die Verwendung ist ziemlich einfach:

from termcolor import colored

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

Oder in Python 3:

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

Es ist jedoch möglicherweise nicht hoch genug für die Spielprogrammierung und die "farbigen Blöcke", die Sie ausführen möchten ...

Samat Jain
quelle
2
Funktioniert es unter Windows (DOS-Konsolen), wenn ansi.sys geladen wird, da es ANSI-Codes ausgibt? support.microsoft.com/kb/101875
Phil P
37
Ich habe gerade bemerkt, dass es ab dem 13.01.2011 unter MIT-Lizenz steht
Alexander Tsepkov
12
hat keine Unittests (im Gegensatz zu Colorado) und seit 2011 nicht mehr aktualisiert
Janus Troelsen
5
termcolor.COLORSgibt Ihnen eine Liste von Farben
akxlr
23
Unter Windows werden os.system('color')zuerst die ANSI-Escape-Sequenzen ausgeführt.
Szabolcs
717

Die Antwort lautet Colorama für alle plattformübergreifenden Farben in Python.

Ein Python 3.6-Beispiel-Screenshot: Beispiel Screenshot

Priester
quelle
317
Als Autor von Colorama danke für die Erwähnung @ nbv4. Ich werde versuchen, ein wenig zu klären: Colorama möchte, dass Python-Programme farbigen Terminaltext auf allen Plattformen drucken und dabei dieselben ANSI-Codes verwenden, wie in vielen anderen Antworten auf dieser Seite beschrieben. Unter Windows entfernt Colorama diese ANSI-Zeichen von stdout und konvertiert sie in entsprechende win32-Aufrufe für farbigen Text. Auf anderen Plattformen macht Colorama nichts. Daher können Sie ANSI-Codes oder Module wie Termcolor verwenden, und mit Colorama funktionieren sie auf allen Plattformen. Ist das sowieso eine Idee?
Jonathan Hartley
2
@ Jonathan, Dies ist wirklich eine tolle Bibliothek! Die Möglichkeit, plattformübergreifende Python-Farbausgaben zu erstellen, ist wirklich sehr schön und nützlich. Ich stelle Tools für eine Bibliothek bereit, die ihre eigene Konsole färbt. Ich kann die Ausgabe dieser Konsole zum Terminal umleiten und die Ausgabe kolorieren. Jetzt kann ich sogar eine Bibliothek erstellen und den Benutzer Farben auswählen lassen. Auf diese Weise können farbenblinde Personen die Dinge so einstellen, dass sie die Ausgabe tatsächlich korrekt sehen können. Danke
Demolishun
50
Dies sollte in der Standardbibliothek enthalten sein ... Plattformübergreifende Farbunterstützung ist wichtig, denke ich.
Daviewales
5
Colorama ist großartig! Schauen Sie sich auch ansimarkup an , das auf colorama basiert und es Ihnen ermöglicht, ein einfaches tagbasiertes Markup (z. B. <b>bold</b>) zum Hinzufügen von Stil zum Terminaltext zu verwenden
gvalkov
30
Dies funktioniert nicht ohne den Aufruf von colorama.init (). Stimmen Sie ab!
Smit Johnth
428

Drucken Sie eine Zeichenfolge, die eine Farbe / einen Stil beginnt, dann die Zeichenfolge und beenden Sie die Farb- / Stiländerung mit '\x1b[0m':

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

Erfolg mit grünem Hintergrund Beispiel

Rufen Sie eine Tabelle mit Formatoptionen für Shell-Text mit folgendem Code ab:

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

Hell-Dunkel-Beispiel (vollständig)

Geben Sie hier die Bildbeschreibung ein

Beispiel Dark-on-Light (teilweise)

oberer Teil der Ausgabe

rabin utam
quelle
8
Dies funktioniert in den meisten Shells sowie in Ipython, gut genug für die meisten Anwendungen
schneidig
4
Kann ich fragen, welches Terminal das ist?
FlipTack
4
Wie tragbar ist es?
Ruggero Turra
2
Kurze eigenständige Implementierung: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920
Jonathan H
203

Definieren Sie eine Zeichenfolge, die eine Farbe beginnt, und eine Zeichenfolge, die die Farbe beendet, und drucken Sie dann Ihren Text mit der Startzeichenfolge vorne und der Endzeichenfolge am Ende.

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

Dadurch ergibt sich die folgende in bash, in urxvtmit einem Farbschema Zenburn-style:

Ausgabefarben

Durch Experimente können wir mehr Farben erhalten:

Farbmatrix

Hinweis: \33[5mund \33[6mblinken.

Auf diese Weise können wir eine vollständige Farbkollektion erstellen:

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'

Hier ist der Code zum Generieren des Tests:

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
quelle
2
Wie hast du txt zum Blinken gebracht
WiLL_K
2
Welche Shell oder welches Terminal lässt es blinken?
Zypps987
1
(u) rxvt zum Beispiel
qubodup
6
Der blinkende Text funktioniert wirklich sehr gut. Wie höre ich damit auf? Alle aufeinander folgenden Ausdrucke blinken aus irgendeinem Grund. Mein Terminal glaubt, es ist Partyzeit!
Kapitän
3
Am Ende der Zeichenfolge blinken, setzen \33[0moder CENDdarüber.
Stiffy2000
94

Sie möchten mehr über ANSI-Escape-Sequenzen erfahren. Hier ist ein kurzes Beispiel:

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

Weitere Informationen finden Sie unter http://en.wikipedia.org/wiki/ANSI_escape_code

Versuchen Sie für ein Blockzeichen ein Unicode-Zeichen wie \ u2588:

print(u"\u2588")

Alles zusammen:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
Bryan Oakley
quelle
3
Versuchen Sie es def d(*v): return '\x1B['+';'.join(map(str, v))+'m'dannprint ' '.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
Was bedeutet hier Zurücksetzen?
MohitC
72

Ich antworte, weil ich eine Möglichkeit gefunden habe, ANSI-Codes unter Windows 10 zu verwenden, damit Sie die Farbe von Text ohne Module ändern können, die nicht integriert sind:

Die Zeile, mit der dies funktioniert, ist os.system("")oder ein anderer Systemaufruf, mit dem Sie ANSI-Codes im Terminal drucken können:

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

Hinweis: Obwohl dies dieselben Optionen wie andere Windows-Optionen bietet, unterstützt Windows ANSI-Codes trotz dieses Tricks nicht vollständig. Nicht alle Textdekorationsfarben funktionieren und alle "hellen" Farben (Codes 90-97 und 100-107) zeigen die gleichen Farben wie die regulären Farben (Codes 30-37 und 40-47).

Edit : Danke an @jl für die Suche nach einer noch kürzeren Methode.

tl; dr : Fügen Sie os.system("")oben in Ihrer Datei hinzu.

Python-Version: 3.6.7

SimpleBinary
quelle
2
Dies funktioniert - ich bin wirklich überrascht, dass der Farbbefehl ANSI-Codes im Windows-Terminal aktiviert. Ich habe jahrelang nicht gewusst, dass dies möglich ist. Der Befehl selbst gibt keinen Hinweis darauf, dass dies der Fall ist.
Stuart Axon
1
Am einfachsten und funktioniert perfekt. Vielen Dank.
Ari
3
Um klar zu sein, funktioniert dies nur unter Windows 10.
Anaksunaman
2
Funktioniert nicht unter Windows 7 / 8.1.
Nikos
2
Vielen Dank für Ihre Antwort, @SimpleBinary! Beim Herumspielen mit Ihrer Antwort habe ich festgestellt, dass Sie if sys.platform.lower() == "win32": os.system('color')noch weiter vereinfachen können, indem Sie sie einfach durch just ersetzen os.system(''). Es ist keine Bedingung erforderlich, und der Code läuft sowohl unter Windows 10 als auch unter Linux (als ich ihn getestet habe). Wie Sie sehen, müssen Sie keinen Systemaufruf durchführen color. Anrufe zu dir, cd, abcdef, und nur ein leerer String funktionieren (obwohl die nicht-leere Strings werden wahrscheinlich drucken Ausgabe , die Sie wollen nicht sehen).
JL
60

Mein Lieblingsweg ist die Blessings- Bibliothek (vollständige Offenlegung: Ich habe sie geschrieben). Zum Beispiel:

from blessings import Terminal

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

Um farbige Steine ​​zu drucken, ist es am zuverlässigsten, Räume mit Hintergrundfarben zu drucken. Ich benutze diese Technik, um den Fortschrittsbalken in nasenprogressiv zu zeichnen :

print t.on_green(' ')

Sie können auch an bestimmten Orten drucken:

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

Wenn Sie sich im Laufe Ihres Spiels mit anderen Terminalfunktionen herumschlagen müssen, können Sie dies auch tun. Sie können die Standard-Zeichenfolgenformatierung von Python verwenden, um die Lesbarkeit zu gewährleisten:

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

Das Schöne an Blessings ist, dass es sein Bestes tut, um an allen Arten von Terminals zu arbeiten, nicht nur an den (überwiegend üblichen) ANSI-Farbterminals. Außerdem werden unlesbare Escape-Sequenzen aus Ihrem Code herausgehalten, während die Verwendung präzise bleibt. Habe Spaß!

Erik Rose
quelle
65
Das Setzen der Farbe als Funktionsname und nicht als Parameter ist eine fragwürdige Praxis.
LtWorf
1
@LtWorf: Sie können es leicht zu einem Parameter machen, getattrwenn Sie es brauchen. Oder erstellen Sie die Formatzeichenfolge eher dynamisch.
JFS
8
@progo die Tatsache, dass Sie es tun können, bedeutet nicht, dass Sie es tun sollten. Es ist allgemeiner, wenn die Farbe ein Parameter ist, den Sie einfach übergeben können.
LtWorf
2
Sie haben can just passeine Python-Funktion.
MaxNoe
2
Beachten Sie, dass das Importieren von Segen unter Windows nicht funktioniert. Verwenden Sie es daher nicht, wenn Ihr Skript plattformübergreifend sein muss.
Adversus
58

sty ähnelt colorama, ist jedoch weniger ausführlich, unterstützt 8- Bit- und 24- Bit- Farben (RGB), ermöglicht das Registrieren eigener Stile, unterstützt Muting, ist sehr flexibel, gut dokumentiert und bietet mehr.

Beispiele:

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

Drucke:

Geben Sie hier die Bildbeschreibung ein

Demo: Geben Sie hier die Bildbeschreibung ein

Rotareti
quelle
7
Es wäre sehr nützlich, wenn Sie überlegen, es mit colorama zu vergleichen. Ich bevorzuge Ihre Bibliothek, aber nur, weil die API kurz ist, und es wäre großartig, wenn sie populärer wäre. Vielen Dank!
Victor Gavro
Ich mag Sty und versuche, meine Zeichenfolge mit Sty zu formatieren. Ein Problem ist, dass ich beim Drucken mehrerer Farben die vorherige Farbe anstelle der Standardfarbe zurücksetzen kann.
Intijk
@ VictorGavro Das ist eine gute Idee! Ich kann der Dokumentation einen Vergleich hinzufügen.
Rotareti
@intijk Deine Frage passt nicht wirklich in den Kommentarbereich. Für diese Art von Frage erstellen Sie bitte eine neue SO-Frage oder verwenden Sie den Github Issue Tracker.
Rotareti
53

Generierte eine Klasse mit allen Farben mithilfe einer for-Schleife, um jede Farbkombination bis zu 100 zu wiederholen, und schrieb dann eine Klasse mit Python-Farben. Kopieren Sie und fügen Sie ein, wie Sie wollen, GPLv2 von mir:

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

Versuchen Sie diesen einfachen Code

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
quelle
19
Vorschlag: Definieren Sie Lambdas, die diese farbige Zeichenfolge zurückgeben, anstatt sie direkt zu drucken, damit sie in Verbindung mit anderen Zeichenfolgen verwendet werden können.
Gustafbstrom
34

Unter Windows können Sie das Modul 'win32console' (in einigen Python-Distributionen verfügbar) oder das Modul 'ctypes' (Python 2.5 und höher) verwenden, um auf die Win32-API zuzugreifen.

Informationen zum vollständigen Code, der beide Möglichkeiten unterstützt, finden Sie im Farbkonsolen-Berichtscode von Testoob .

ctypes Beispiel:

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
quelle
2
Ehrlich gesagt ist dies nur eine Lösung, die mit Windows funktioniert. Alle anderen Antworten sind nur Kopien von einander.
Danilo
FWIW, unter Windows ist die Verwendung von ConEmu, das ANSI-Sequenzen unterstützt, möglicherweise weniger schmerzhaft (abgesehen von einer Reihe weiterer Vorteile gegenüber dem nativen Terminal). Trotzdem großartig, eine native Lösung zu haben.
Beende beide
Ich bin bei Danilo.
Muhammad Ali
24

Dumm einfach, basierend auf @ joelds Antwort

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)

Dann einfach

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
zahanm
quelle
2
Dies wird abstürzen, wenn Sie mehr als ein Positionsargument oder etwas anderes als einen String-Typ übergeben
Romain Vincent
@RomainVincent Übergeben Sie dann nicht mehr als ein Positionsargument oder etwas anderes als einen String ty - warten Sie, das sind print-ersetzungen ? Einspruch aufgehoben.
wizzwizz4
1
@ wizzwizz4 Ich bin mir nicht sicher, was du mit diesem Kommentar gemeint hast, ich verstehe den Punkt sowieso nicht. Wenn Sie eine Klasse vorschlagen möchten ..., um eine so einfache Methode wie das Drucken zu ersetzen, können Sie genauso gut vermeiden, sie so leicht zerbrechlich zu machen. Nur meine Meinung.
Romain Vincent
1
@RomainVincent Ich wollte sagen, dass Ihr Einwand falsch war, aber um eine so vielseitige Funktion zu ersetzen, printsollte man sicherstellen, dass ihre Funktionalität ordnungsgemäß repliziert wird.
wizzwizz4
1
@RomainVincent Implementiert, um unendliche Argumente zu verwenden: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</ code>
Emilien Baudet
23

Ich habe die Antwort von @joeld in ein Modul mit globalen Funktionen eingeschlossen, die ich überall in meinem Code verwenden kann.

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

Verwenden Sie wie folgt:

 import log
    log.info("Hello World")
    log.err("System Error")
Mohamed Samy
quelle
22

Unter Windows können Sie nur dann mit Farben auf der Konsole drucken, wenn Sie win32api verwenden.

Für Linux ist es so einfach wie das Verwenden von print. Die hier beschriebenen Escape-Sequenzen sind:

Farben

Damit das Zeichen wie eine Box gedruckt werden kann, hängt es wirklich davon ab, welche Schriftart Sie für das Konsolenfenster verwenden. Das Pfund-Symbol funktioniert gut, hängt jedoch von der Schriftart ab:

#
UberJumper
quelle
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))

Text mit wechselndem Vordergrund und Hintergrund, Farben 0..141 Text mit wechselndem Vordergrund und Hintergrund, Farben 142..255

Andriy Makukha
quelle
20

Am Ende tat ich das, ich fand es am saubersten:

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
quelle
Dies ist wirklich gut, wenn Sie ohne ein Paket eines Drittanbieters auskommen.
Jamie Counsell
20

Aufbauend auf der Antwort von @joeld unter Verwendung von 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

Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein


Einige Updates color_printmit neuen Formatierern, zB:

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

Hinweis: italic, fast blinkingund strikethroughkann auf allen Endgeräten nicht funktioniert, funktioniert nicht auf Mac / Ubuntu.

Z.B

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

Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein

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

Versuchen Sie es online

Vishal
quelle
Ist das nur für Python3? habe einen Fehler bei sep = '' mit python2
ScipioAfricanus
Arbeiten perfekt in Python3 Ubuntu 18.04
Julius Prayogo
18

Beachten Sie, wie gut sich das withSchlüsselwort mit solchen Modifikatoren mischt, die zurückgesetzt werden müssen (mit Python 3 und 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
quelle
Versucht Colorama, verwendet print(Style.BRIGHT + "Header Test")und print (Style.DIM + word)eine wirklich schöne Eingabeaufforderung zu erstellen.
Tom
Dies muss geändert werden, um contextlibfür Py3 verwendet zu werden.
Katze
@cat: Ab welcher Python-Version wird das notwendig sein?
Janus Troelsen
Ich glaube 3 und höher - es sollte einen @contextlib.contextmanagerDekorateur drauf haben, nein?
Katze
1
@cat: Warum? Funktioniert gut ohne.
Janus Troelsen
17

Sie können die Python-Implementierung der Curses-Bibliothek verwenden: http://docs.python.org/library/curses.html

Führen Sie dies auch aus und Sie finden Ihre Box:

for i in range(255):
    print i, chr(i)
daharon
quelle
Persönlich denke ich, dass die 'Fluch'-Bibliothek durch' Segen 'völlig verdunkelt wurde, genauso wie' Anfragen '' Urllib 'usw. verdunkelt haben
Jonathan Hartley
17

Sie könnten CLINT verwenden:

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

Hol es dir von GitHub .

Giacomo Lacava
quelle
1
Der erste Link ist weg, also habe ich ihn entfernt. Die GH-Verbindung ist immer noch gut (obwohl das Projekt "archiviert" und im Grunde genommen aufgegeben ist, soweit ich das beurteilen kann).
Giacomo Lacava
15

Ich weiß, dass ich zu spät komme. Aber ich habe eine Bibliothek namens ColorIt . Es ist super einfach.

Hier sind einige Beispiele:

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

Dies gibt Ihnen:

Bild von ColorIt

Es ist auch erwähnenswert, dass dies plattformübergreifend ist und unter Mac, Linux und Windows getestet wurde.

Vielleicht möchten Sie es ausprobieren: https://github.com/CodeForeverAndEver/ColorIt

Hinweis: Blinken, Kursivschrift, Fettdruck usw. werden in wenigen Tagen hinzugefügt.

BeastCoder
quelle
14

Wenn Sie ein Spiel programmieren, möchten Sie vielleicht die Hintergrundfarbe ändern und nur Leerzeichen verwenden? Zum Beispiel:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"
suhib-alsisan
quelle
Mehr dazu finden Sie hier- linux.byexamples.com/archives/184/…
pragmatisch
11

Wenn Sie Windows verwenden, können Sie loslegen!

# 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
quelle
Wenn Sie unterschiedliche Farben in derselben Zeile print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
wünschen, leeren Sie den Standard-
11

Wenn Sie Django verwenden

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

Schnappschuss:

Bild

(Ich verwende im Allgemeinen eine farbige Ausgabe zum Debuggen auf dem Runserver-Terminal, also habe ich sie hinzugefügt.)

Sie können testen, ob es auf Ihrem Computer
$ python -c "import django; print django.VERSION"
installiert ist : Um es zu installieren, überprüfen Sie: So installieren Sie Django

Versuche es!!

Grijesh Chauhan
quelle
10

Hier ist ein Fluchbeispiel:

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
quelle
Ihr Code schlägt unter Windows (x64) mit folgendem Fehler fehl: AttributeError: Das Objekt 'module' hat kein Attribut 'wrapper'
sorin
1
@ Sorin Sbarnea: Entsprechend der offiziellen Dokumentation zu Python Curses in docs.python.org/library/curses.html wird das Curses-Modul unter Windows nicht unterstützt. Vielleicht haben Sie diesen Fehler anstelle von "No Such Module" oder so ähnlich erhalten, weil Sie Ihre Testdatei wahrscheinlich "curses.py" genannt haben, damit sie sich selbst importiert.
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
quelle
10

asciimatics bietet eine tragbare Unterstützung für das Erstellen von Textoberflächen und Animationen:

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

regenbogenfarbener Text unter ASCII-Rauschen

jfs
quelle
10

Noch ein Pypi-Modul, das die Python 3-Druckfunktion umschließt:

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

Es ist in Python 2.x verwendbar, wenn Sie auch from __future__ import print. Hier ist ein Python 2-Beispiel von der Modul-Pypi-Seite:

from __future__ import print_function
from colorprint import *

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

Ausgänge "Hallo Welt!" mit den Wörtern in blau und dem Ausrufezeichen fett rot und blinkend.

drevicko
quelle