[elbe-devel] [PATCH v4 1/1] Python3: fix encoding for both py2 and py3
Bastian Germann
bage at linutronix.de
Thu Mar 12 14:12:45 CET 2020
Am 14.02.20 um 15:50 schrieb Christian Teklenborg:
> Python3 has unicode strings as default whereas Python2 has binary strings.
> To avoid TypeErrors change the encoding at the necessary places.
> At some points we need only unicode strings but a string in Python3 doesn't have
> a decode() function and we need this decode() function to get a unicode string
> from a Python2 binary string. Python2 strings have an encode function, thus use
> .encode().decode() to make sure we end up with a unicode string in both cases.
>
> Again, this gets rid of the last unicode() calls which are not available on
> Python3.
>
> Signed-off-by: Christian Teklenborg <chris at linutronix.de>
Reviewed-by: Bastian Germann <bage at linutronix.de>
> ---
> elbepack/daemons/soap/esoap.py | 2 +-
> elbepack/efilesystem.py | 13 ++++++++-----
> elbepack/elbexml.py | 4 ++--
> elbepack/licencexml.py | 9 +++++++--
> elbepack/rfs.py | 4 ++--
> elbepack/soapclient.py | 8 ++++----
> 6 files changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/elbepack/daemons/soap/esoap.py b/elbepack/daemons/soap/esoap.py
> index 7d76d6a3..ddc09018 100644
> --- a/elbepack/daemons/soap/esoap.py
> +++ b/elbepack/daemons/soap/esoap.py
> @@ -178,7 +178,7 @@ class ESoap (ServiceBase):
> if pos >= file_stat.st_size:
> return "EndOfFile"
>
> - with open(file_name) as fp:
> + with open(file_name, 'rb') as fp:
> if not fp:
> return "FileNotFound"
> try:
> diff --git a/elbepack/efilesystem.py b/elbepack/efilesystem.py
> index 5bc20afd..0c3b03e0 100644
> --- a/elbepack/efilesystem.py
> +++ b/elbepack/efilesystem.py
> @@ -147,18 +147,21 @@ class ElbeFilesystem(Filesystem):
> copyright_file = os.path.join('/usr/share/doc', pkg, 'copyright')
> copyright_fname = self.fname(copyright_file)
> try:
> - with io.open(copyright_fname, "rb") as lic:
> + with io.open(copyright_fname, "r",
> + encoding='utf-8', errors='replace') as lic:
> lic_text = lic.read()
> except IOError as e:
> logging.exception("Error while processing license file %s",
> copyright_fname)
> - lic_text = "Error while processing license file %s: '%s'" % (
> + lic_text = u"Error while processing license file %s: '%s'" % (
> copyright_file, e.strerror)
> -
> - lic_text = unicode(lic_text, encoding='utf-8', errors='replace')
> + # in Python2 'pkg' is a binary string whereas in Python3 it is a
> + # unicode string. So make sure that pkg ends up as a unicode string
> + # in both Python2 and Python3.
> + pkg = pkg.encode(encoding='utf-8').decode(encoding='utf-8')
>
> if f is not None:
> - f.write(unicode(pkg))
> + f.write(pkg)
> f.write(u":\n======================================"
> "==========================================")
> f.write(u"\n")
> diff --git a/elbepack/elbexml.py b/elbepack/elbexml.py
> index 9029062a..fa815839 100644
> --- a/elbepack/elbexml.py
> +++ b/elbepack/elbexml.py
> @@ -193,13 +193,13 @@ class ElbeXML(object):
> ret = False
> if "srcstr" in r:
> for line in fp:
> - needle = bytes(r["srcstr"])
> + needle = r["srcstr"].encode(encoding='utf-8')
> if line.find(needle) != -1:
> ret = True
> break
> elif "binstr" in r:
> for line in fp:
> - needle = bytes(r["binstr"])
> + needle = r["binstr"].encode(encoding='utf-8')
> if line.find(needle) != -1:
> ret = True
> break
> diff --git a/elbepack/licencexml.py b/elbepack/licencexml.py
> index 6324fe4f..f5f4ee5e 100644
> --- a/elbepack/licencexml.py
> +++ b/elbepack/licencexml.py
> @@ -59,8 +59,13 @@ class copyright_xml (object):
> xmlpkg.et.attrib['name'] = pkg_name
> txtnode = xmlpkg.append('text')
> txtnode.et.text = copyright_text
> -
> - bytesio = io.StringIO(unicode(txtnode.et.text))
> + # in Python2 'txtnode.et.text' is a binary string whereas in Python3 it
> + # is a unicode string. So make sure that 'txtnode.et.text' ends up as a
> + # unicode string in both Python2 and Python3.
> + bytesio = io.StringIO(txtnode.et.text.encode(encoding='utf-8',
> + errors='replace')
> + .decode(encoding='utf-8',
> + errors='replace'))
> try:
> c = Copyright(bytesio)
> files = []
> diff --git a/elbepack/rfs.py b/elbepack/rfs.py
> index c65d9831..6967d289 100644
> --- a/elbepack/rfs.py
> +++ b/elbepack/rfs.py
> @@ -186,7 +186,7 @@ class BuildEnv (object):
> if arch == "default":
> arch = self.xml.text("project/buildimage/arch", key="arch")
>
> - host_arch = get_command_out("dpkg --print-architecture").strip()
> + host_arch = get_command_out("dpkg --print-architecture").strip().decode()
>
> includepkgs = None
> strapcmd = 'debootstrap '
> @@ -317,7 +317,7 @@ class BuildEnv (object):
>
>
> def seed_etc(self):
> - passwd = self.xml.text("target/passwd")
> + passwd = self.xml.text("target/passwd").encode(encoding='utf-8')
> stdin = "%s\n%s\n" % (passwd, passwd)
> chroot(self.rfs.path, "passwd", stdin=stdin)
>
> diff --git a/elbepack/soapclient.py b/elbepack/soapclient.py
> index 589bdefd..586fa513 100644
> --- a/elbepack/soapclient.py
> +++ b/elbepack/soapclient.py
> @@ -454,15 +454,15 @@ class GetFileAction(ClientAction):
> file=sys.stderr)
> sys.exit(20)
>
> - builddir = args[0]
> - filename = args[1]
> - dst_fname = filename
> + builddir = args[0].encode()
> + filename = args[1].encode()
> + dst_fname = filename.encode()
>
> if opt.output:
> fs = Filesystem('/')
> dst = os.path.abspath(opt.output)
> fs.mkdir_p(dst)
> - dst_fname = str(os.path.join(dst, filename))
> + dst_fname = str(os.path.join(dst, filename)).encode()
>
> client.download_file(builddir, filename, dst_fname)
> print("%s saved" % dst_fname)
>
More information about the elbe-devel
mailing list