3256 Stimmen

Wie drucke ich farbigen Text auf dem Terminal in Python?

Wie kann ich in Python farbigen Text auf dem Terminal ausgeben?

1 Stimmen

Dieses Symbol eignet sich hervorragend für einen farbigen Block: Das einzige Problem ist, dass es sich um erweitertes ASCII handelt, vielleicht kann man es mit http://stackoverflow.com/questions/8465226/using-extended-as‌​cii-codes-with-pytho‌​n

1 Stimmen

Einige Terminals können auch Unicode-Zeichen anzeigen. Wenn dies auf Ihr Terminal zutrifft, sind die möglichen Zeichen fast unbegrenzt.

9 Stimmen

Diese Antwort kam ziemlich spät, aber sie scheint mir die beste zu sein... die anderen Antworten erfordern spezielle Hacks für Windows, während diese Antwort einfach funktioniert: stackoverflow.com/a/3332860/901641

41voto

orip Punkte 69138

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

Vollständigen Code, der beide Wege unterstützt, finden Sie in der Farbkonsolen-Meldecode 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)

3 Stimmen

Ehrlich gesagt ist dies die einzige Lösung, die unter Windows funktioniert. Alle anderen Antworten sind nur Kopien der anderen.

0 Stimmen

FWIW, unter Windows könnte es weniger schmerzhaft sein, ConEmu zu verwenden, das ANSI-Sequenzen unterstützt (abgesehen von einer Reihe anderer Vorteile gegenüber dem nativen Terminal). Immer noch toll, eine native Lösung obwohl haben.

1 Stimmen

Ich stimme Danilo zu.

38voto

mms Punkte 757

Ich habe eingewickelt joelds Antwort in ein Modul mit globalen Funktionen, die ich überall in meinem Code verwenden kann.

Datei: log.py

def enable():
    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)

enable()

Verwenden Sie wie folgt:

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

37voto

bluenote10 Punkte 19644

Hier ist meine moderne (2021) Lösung: yachalk

Sie ist eine der wenigen Bibliotheken, die verschachtelte Stile richtig unterstützt:

enter image description here

Abgesehen davon ist yachalk autovervollständigungsfreundlich, unterstützt 256 Farben, verfügt über eine Terminal-Erkennung und ist voll typisiert.

Hier sind einige Design-Entscheidungen, die Sie bei der Auswahl Ihrer Lösung berücksichtigen können.

High-Level-Bibliotheken vs. Low-Level-Bibliotheken / manuelle Handhabung des Stils?

Viele Antworten auf diese Frage zeigen, wie ANSI-Escape-Codes direkt verwendet werden können, oder schlagen Low-Level-Bibliotheken vor, die eine manuelle Aktivierung/Deaktivierung des Stils erfordern.

Diese Ansätze sind nicht unproblematisch: Das manuelle Einfügen von Ein/Aus-Stilen ist

  • syntaktisch ausführlicher, da Rücksetzungen explizit angegeben werden müssen,
  • fehleranfälliger, weil man versehentlich vergessen kann, einen Stil zurückzusetzen,
  • nicht in der Lage ist, Randfälle richtig zu behandeln: In einigen Terminals ist es zum Beispiel notwendig, die Stile vor dem Zeilenumbruch zurückzusetzen und sie nach dem Zeilenumbruch wieder zu aktivieren. Außerdem haben einige Terminals Probleme mit dem einfachen Überschreiben sich gegenseitig ausschließender Stile und erfordern das Einfügen "unnötiger" Rücksetzcodes. Wenn das lokale Terminal eines Entwicklers diese Macken nicht hat, wird der Entwickler diese Macken nicht sofort entdecken. Das Problem wird erst später von anderen gemeldet oder verursacht Probleme z.B. auf CI-Terminals.

Wenn die Kompatibilität mit vielen Terminals ein Ziel ist, ist es daher am besten, eine High-Level-Bibliothek zu verwenden, die eine automatische Handhabung von Stil-Resets bietet. Dies ermöglicht der Bibliothek, sich um alle Randfälle zu kümmern, indem sie die "ungewollten" ANSI-Escape-Codes einfügt, wo sie benötigt werden.

Warum noch eine weitere Bibliothek?

In JavaScript ist die De-facto-Standardbibliothek für diese Aufgabe Kreide und nachdem ich es eine Zeit lang in JS-Projekten verwendet hatte, waren die in der Python-Welt verfügbaren Lösungen im Vergleich dazu unzureichend. Die Kreide-API ist nicht nur bequemer in der Anwendung (vollständig kompatibel mit der Autovervollständigung), sondern auch für alle Randfälle geeignet.

Die Idee der yachalk ist es, den gleichen Komfort in das Python-Ökosystem zu bringen. Wenn Sie an einem Vergleich mit anderen Bibliotheken interessiert sind, habe ich begonnen Funktionsvergleich auf der Seite Projekte. Außerdem gibt es hier eine lange (aber immer noch unvollständige) Liste von Alternativen, die bei meinen Recherchen aufgetaucht sind - eine Menge zur Auswahl :)

1 Stimmen

Aber Sie scheinen die Farben zu vermissen, github.com/timofurrer/farbig

33voto

Vishal Punkte 18723
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")

Online ausprobieren

1 Stimmen

Ist dies für python3 nur? bekam einen Fehler auf sep='' mit python2

1 Stimmen

Dies sollte die akzeptierte Antwort für python3 sein. Funktioniert perfekt.

30voto

Ben174 Punkte 3194

Ich habe mich für diesen Weg entschieden, weil ich ihn für den saubersten halte:

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)

0 Stimmen

Das ist wirklich gut, wenn man es ohne ein Drittanbieterpaket machen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X