64 votes

Comment imprimer une sortie colorée dans le terminal en Python ?

Existe-t-il un équivalent en Python de l'outil Perl

print color 'red';
print <something>;
print color 'reset';

disponible ?

J'utilise cette approche :

"\x1b[1;%dm" % (<color code>) + "ERROR: log file does not exist" + "\x1b[0m"

Ce que je veux, c'est pouvoir définir la couleur de tous les messages d'impression, par exemple,

print color 'red'
function_print_something(<some message>)
print color 'reset'

Ici, 'function_print_something' est ma fonction python qui imprimera des messages de journal formatés sur l'écran.

0 votes

Vous pouvez regarder ici stackoverflow.com/questions/27265322/

1 votes

Cela répond-il à votre question ? Comment imprimer un texte coloré sur le terminal ?

113voto

zdim Points 29788

Est-ce que le Module Python termcolor faire ? Ce serait un équivalent approximatif pour certaines utilisations.

from termcolor import colored

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

L'exemple est tiré de ce poste qui en contient beaucoup plus. Voici une partie de l'exemple tiré de la documentation

import sys
from termcolor import colored, cprint

text = colored('Hello, World!', 'red', attrs=['reverse', 'blink'])
print(text)
cprint('Hello, World!', 'green', 'on_red')

Une exigence spécifique était de définir la couleur, et probablement d'autres attributs du terminal, de sorte que toutes les impressions suivantes soient de cette façon. Bien que j'aie déclaré dans le message original que cela était possible avec ce module, je ne le pense plus. Voir la dernière section pour une façon de le faire.

Cependant, la plupart du temps, nous imprimons de courts segments de texte en couleur, une ligne ou deux. L'interface présentée dans ces exemples est donc peut-être mieux adaptée que d'activer une couleur, d'imprimer, puis de la désactiver (comme dans l'exemple Perl présenté). (Comme dans l'exemple Perl présenté.) Peut-être pouvez-vous ajouter un ou plusieurs arguments optionnels à votre fonction d'impression pour colorer la sortie, et dans la fonction utiliser les fonctions du module pour colorer le texte. Cela permet également de résoudre plus facilement les conflits occasionnels entre le formatage et la coloration. C'est juste une idée.


Voici une approche de base pour configurer le terminal afin que toutes les impressions suivantes soient rendues avec une couleur, des attributs ou un mode donnés.

Une fois qu'une séquence ANSI appropriée est envoyée au terminal, tout le texte suivant est rendu de cette manière. Ainsi, si nous voulons que tout le texte imprimé sur ce terminal à l'avenir soit rouge vif/gras, il faut imprimer ESC[ suivi des codes pour l'attribut "brillant" (1) et la couleur rouge (31), suivi de m

# print "\033[1;31m"   # this would emit a new line as well
import sys
sys.stdout.write("\033[1;31m")
print "All following prints will be red ..."

Pour désactiver tout attribut précédemment défini, utilisez 0 pour l'attribut, \033[0;35m (magenta).

Pour supprimer une nouvelle ligne dans python 3, utilisez print('...', end="") . Le reste du travail consiste à emballer le tout pour une utilisation modulaire (et pour une digestion plus facile).

Fichier colors.py

RED   = "\033[1;31m"  
BLUE  = "\033[1;34m"
CYAN  = "\033[1;36m"
GREEN = "\033[0;32m"
RESET = "\033[0;0m"
BOLD    = "\033[;1m"
REVERSE = "\033[;7m"

Je recommande une lecture rapide de quelques références sur les codes. Les couleurs et les attributs peuvent être combinés et on peut constituer une belle liste dans ce paquet. Un script

import sys
from colors import *

sys.stdout.write(RED)
print "All following prints rendered in red, until changed"

sys.stdout.write(REVERSE + CYAN)
print "From now on change to cyan, in reverse mode"
print "NOTE: 'CYAN + REVERSE' wouldn't work"

sys.stdout.write(RESET)
print "'REVERSE' and similar modes need be reset explicitly"
print "For color alone this is not needed; just change to new color"
print "All normal prints after 'RESET' above."

Si l'utilisation constante de sys.stdout.write() est un problème, il peut être enveloppé dans une petite fonction, ou le paquet peut être transformé en une classe avec des méthodes qui définissent le comportement du terminal (impression des codes ANSI).

Une partie de ce qui précède est plutôt une suggestion de recherche, comme la combinaison du mode inverse et de la couleur. (Ceci est disponible dans le module Perl utilisé dans la question, et est également sensible à l'ordre et similaire).


Une liste pratique de codes d'échappement est étonnamment difficile à trouver, tandis qu'il existe de nombreuses références sur le comportement des terminaux et la manière de le contrôler. Le site Page wiki sur les codes d'échappement ANSI possède toutes les informations mais nécessite un peu de travail pour les rassembler. Pages sur Invite Bash ont beaucoup d'informations spécifiques et utiles. Voici une autre page avec des tableaux de codes droits. Il existe bien d'autres choses.

Il peut être utilisé avec un module comme termocolor .

0 votes

"Vous pouvez également l'utiliser exactement comme dans votre exemple Perl - définir une couleur (il imprime la séquence d'échappement ANSI pour cette couleur dans le terminal) afin que toutes les impressions suivantes soient de cette couleur, jusqu'à ce qu'elles soient modifiées ou réinitialisées.

0 votes

@TurboSullivan Je crois me souvenir d'un tel usage, mais je ne m'en souviens pas pour l'instant. J'y jetterai un coup d'œil demain (c'est le jour de la semaine). très en retard ici) et répondre/poster. En fait, cette utilisation est la partie la plus facile - tout ce que vous devez faire est d'imprimer l'ANSI pour la couleur et les attributs, et tout le reste va de cette façon. Vous pouvez donc les configurer et simplement print RED et toutes les empreintes sont rouges. L'impression de ces séquences ANSI dans le terminal permet d'utiliser ce style, jusqu'à ce qu'il soit modifié. Mais je vais chercher un moyen plus simple.

0 votes

@TurboSullivan Jusqu'à présent, je n'ai pas trouvé comment ce module pourrait fournir le comportement que vous voulez (mais je pourrais jurer que c'est possible). Pendant que je cherche comment le faire, j'ai ajouté au post un moyen de le faire via des impressions de codes basiques, enveloppées dans un module pour une utilisation normale (agréable). S'il vous plaît laissez-moi savoir comment cela fonctionne pour vous.

25voto

leOm Points 20

Je propose stylo . C'est similaire à colorama, mais moins verbeux et il supporte 8bit et 24 bits couleurs. Vous pouvez également étendre le registre de couleurs avec vos propres couleurs.

Exemples :

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

enter image description here

Démonstration :

enter image description here

12voto

Zarif Points 21

Vous pouvez essayer cela avec python 3 :

from termcolor import colored
print(colored('Hello, World!', 'green', 'on_red'))

Si vous utilisez le système d'exploitation Windows, le code ci-dessus peut ne pas fonctionner pour vous. Alors vous pouvez essayer ce code :

from colorama import init
from termcolor import colored

# use Colorama to make Termcolor work on Windows too
init()

# then use Termcolor for all colored text output
print(colored('Hello, World!', 'green', 'on_red'))

J'espère que cela vous aidera.

11voto

Kevin Chou Points 25

Par rapport aux méthodes listées ici, je préfère celle qui est fournie avec le système. Ici, je propose une meilleure méthode sans bibliothèques tierces.

class colors: # You may need to change color settings
    RED = '\033[31m'
    ENDC = '\033[m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'

print(colors.RED + "something you want to print in red color" + colors.ENDC)
print(colors.GREEN + "something you want to print in green color" + colors.ENDC)
print("something you want to print in system default color")

Plus de code de couleur, réf. à : Impression de texte coloré en Python

Amusez-vous bien !

0 votes

Un peu mieux en effet, car nous conservons le support de la syntaxe *args emballée de print() comme en print(colors.RED, "property:" , value, colors.ENDC)

6voto

Remarque : les utilisateurs de Windows devraient exécuter os.system('color') d'abord, sinon vous verrez des séquences d'échappement ANSI plutôt qu'une sortie colorée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X