Wie kann ich in Python farbigen Text auf dem Terminal ausgeben?
Ehrlich gesagt ist dies die einzige Lösung, die unter Windows funktioniert. Alle anderen Antworten sind nur Kopien der anderen.
Wie kann ich in Python farbigen Text auf dem Terminal ausgeben?
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)
Ehrlich gesagt ist dies die einzige Lösung, die unter Windows funktioniert. Alle anderen Antworten sind nur Kopien der anderen.
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.
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")
Hier ist meine moderne (2021) Lösung: yachalk
Sie ist eine der wenigen Bibliotheken, die verschachtelte Stile richtig unterstützt:
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.
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
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.
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 :)
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")
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.
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-ascii-codes-with-python
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
0 Stimmen
Wie wäre es mit stackoverflow.com/a/42528796/610569 mit pypi.python.org/pypi/lazyme ? (Haftungsausschluss: schamlose Werbung)
0 Stimmen
Wenn Sie kein zusätzliches Paket installieren möchten, gehen Sie folgendermaßen vor neue Antwort .