2017-05-31 6 views
0

La définition de la couleur à partir de la chaîne Python fonctionne comme un charme. Voici un extrait de travail de mon script python:AnsiColor Plugin ne fonctionne pas lorsque la chaîne ansi est chargée avec getenv

line = "All Tests OK." 
print('\033[31m \033[1m' + line + '\033[0m'); 

Il en résulte une couleur sortie Jenkins console comme ceci:

All Tests OK. 

Extracting chaînes ANSI à partir du code:

Pour améliorer la lisibilité du code, j'aimerais déplacer les chaînes de couleurs et les séquences d'échappement dans un fichier de configuration global. J'ai donc mon fichier batch build.conf.bat qui a un tas de paramètres globaux pour l'environnement de construction et comprend 5 variables pour ANSIColor comme ceci:

set ansiBlue=\033[34m 
set ansiRed=... 

Dans le script Python, je peux accéder à toutes les variables d'environnement en utilisant

print(os.getenv('ansiBlue') + " " + line + os.getenv('ansiOff')) 

Ceci renvoie une chaîne avec le code ANSI, tel que défini dans le fichier de configuration par lots. Jusqu'à ici, tout va bien mais quand Jenkins dirige la construction, la sortie de la console est comme ceci:

\033[34m All Tests OK. \033[0m 

Ainsi, le travail des chaînes créées manuellement, mais les chaînes à partir de variables ne fonctionnent pas. Pourquoi ça? Donc, ma question est, que puis-je faire pour que ces variables fonctionnent dans la sortie de la console Jenkins?

-

PS: Je l'ai déjà enveloppé la chaîne concatonated dans une variable qui a ensuite été imprimé de chaîne de caractères (str (testOutput)), mais cela était encore sans succès ..

+2

analyseur Python se traduit par un caractère d'échappement '\ 033', mais analyseur de lot ne fait pas que la traduction, de sorte que votre' os.getenv' lit une barre oblique inverse et trois chiffres. Peut-être que quelque chose comme (désolé, python n'est pas ma région) 'os.getenv ('ansiBlue'). Replace ('\\ 033', '\ 033')' pourrait résoudre votre problème. –

+0

'replace' devrait fonctionner, ou en général pour le texte source Latin-1 vous pouvez utiliser' codecs.decode (chaîne_source, 'unicode_escape') '. – eryksun

+0

Merci les gars, l'indice avec replace() a fonctionné bien que je n'ai jamais vu le double backslash dans la sortie. – domih

Répondre

0

Comme l'a dit "@mc nd" la barre oblique inverse a échappé à la sortie en quelque sorte et l'importation d'env n'a pas eu lieu. Donc, un remplaçant le backslash unique avec une double barre oblique inverse a travaillé en ce moment. Merci!!

print(os.getenv('ansiBlue').replace('\\033', '\033') + line + os.getenv('ansiOff').replace('\\033', '\033')); 

Cela améliore la lisibilité du code par le facteur moins dix. Donc, j'extériorise le code de remplacement dans un fichier utilitaire.

print(util.ansiBlue + line + util.ansiOff);