Résout un problème où Fabric ne peut pas transmettre unicode à fabric.api.abort

Le tissu est pratique, n'est-ce pas? C'est tellement pratique que vous pouvez en faire la plupart avec Fabric.

Cependant, puisque Fabric est fabriqué par Python, la gestion de l'unicode peut parfois être un problème. Plus précisément, unicode ne peut pas être transmis à fabric.api.abort ou fabric.api.puts. abort écrit str dans sys.stderr et insère str dans sys.stdout. Passer unicode entraînera une erreur UnicodeEncodeError.

Pour éviter cela, vous devez le convertir en str au lieu d'unicode à l'avance.

from fabric.api import abort, task

@task
def abort_test():
    abort(u"Message d'erreur japonais".encode('CP932'))

Ce n'est pas grave, mais il est difficile d'encoder à chaque utilisation.

Si l'argument passé pour abandonner est unicode, essayez de le convertir en fonction du codage de la destination de sortie.

fabric_patch.py


# -*- encoding: utf-8 -*-
import sys
import fabric
from fabric.api import abort, puts


encodings = {
    abort: sys.stderr.encoding,
    puts: sys.stdout.encoding,
}


def safe_msg(original):
    u"""
    fabric.api.abort/Si vous passez unicode aux put, vous obtiendrez une UnicodeEncodeError sur la sortie, donc
Décorateur pour l'éviter
    """
    def revised(msg, *args, **kwargs):
        if isinstance(msg, unicode):
            encoding = encodings.get(original, None)
            if encoding:
                msg = msg.encode(encoding)
        return original(msg, *args, **kwargs)
    return revised


setattr(fabric.api, "abort", safe_msg(abort))
setattr(fabric.api, "puts", safe_msg(puts))

Placez fabric_patch.py dans le même répertoire que fabfile.py et importez-le avant d'abandonner. Vous pouvez désormais générer des messages d'erreur japonais sans aucun problème sans convertir unicode.

fabfile.py


# -*- encoding: utf-8 -*-
from __future__ import absolute_import
from . import fabric_patch
from fabric.api import abort, task

@task
def abort_test():
    abort(u"Message d'erreur japonais")

Recommended Posts

Résout un problème où Fabric ne peut pas transmettre unicode à fabric.api.abort
Résout un problème où cv2.imread () ne donne pas d'erreur lors de la tentative de lecture d'une image même si le chemin ne passe pas