Stoff ist bequem, nicht wahr? Es ist so praktisch, dass Sie das meiste davon mit Fabric machen können.
Da Fabric jedoch von Python erstellt wird, kann die Handhabung von Unicode manchmal ein Problem sein. Insbesondere kann Unicode nicht an Fabric.api.abort oder Fabric.api.puts übergeben werden. abort schreibt str in sys.stderr und schreibt str in sys.stdout. Das Übergeben von Unicode führt zu einem UnicodeEncodeError.
Um dies zu vermeiden, müssen Sie es im Voraus in str anstelle von Unicode konvertieren.
from fabric.api import abort, task
@task
def abort_test():
abort(u"Japanische Fehlermeldung".encode('CP932'))
Das ist in Ordnung, aber es ist umständlich, bei jeder Verwendung zu codieren.
Wenn das an abort übergebene Argument Unicode ist, versuchen Sie, es gemäß der Codierung des Ausgabeziels zu konvertieren.
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/Wenn Sie Unicode an Puts übergeben, erhalten Sie bei der Ausgabe einen UnicodeEncodeError
Dekorateur, um es zu vermeiden
"""
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))
Platzieren Sie Fabric_Patch.py im selben Verzeichnis wie fabfile.py und importieren Sie es vor dem Abbruch. Jetzt können Sie problemlos japanische Fehlermeldungen ausgeben, ohne Unicode zu konvertieren.
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"Japanische Fehlermeldung")