在TravisCI上的2.7.10应用程序中打印unicode字符时纠正unicode错误

时间:2018-01-26 16:00:09

标签: python python-2.7 unicode travis-ci python-unicode

我正在尝试使用TravisCI上的Python 2.7.10在测试运行器中打印一些unicode字符。

本地(macOS),我可以通过以下方式运行它:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

class MyTestCase(unittest.TestCase):
    def my_test(self):
        for x in alist:
            # a long running op
            # updates item in list
            sys.stdout.write('█')

        for x in alist:
            if x.success:
                print(" ✓ pass   {}".format(x.name))
            else:
                print(" x fail   {}".format(x.name, x.err))

但是当我把它推到TravisCI时,它总是因为那个讨厌的ordinal not in range(128)错误而失败。

我试过了:

  • 将Travis env变量设置为LC_ALLC.UTF-8
  • 使用dist: trusty
  • 使用deploy: \ default_text_charset: 'utf-8'
  • 使用six.u(),但抱怨TypeError: decoding Unicode is not supported

这是我的.travis.yml:

language: python

dist: trusty

python:
  - 2.7.10

install:
  - pip install --quiet future
  - pip install --quiet pyyaml
  - pip install --quiet dotmap

script:
  - cd appdir; python -m unittest tests

deploy:
  default_text_charset: 'utf-8'

1 个答案:

答案 0 :(得分:2)

在Python 2中,sys.stdout.write采用字节字符串。如果你给它unicode,它会强制它str,由于使用了ASCII,这显然会失败。

您可以将sys.stdout包裹在TextIOWrapper中(就像在Python 3中一样):

import io
sys.stdout = io.open(sys.stdout.fileno(), 'w', encoding='utf8')

如果您不想覆盖sys.stdout,请将其保存为其他名称。