【问题标题】:Python and Ansible - codec error UTF-8 to ascii conversionPython 和 Ansible - 编解码器错误 UTF-8 到 ascii 的转换
【发布时间】:2016-11-20 19:54:54
【问题描述】:

设置:

  • Linux 主机上的 Vagrant VM
  • 来宾操作系统是 Ubuntu Linux(bento/ubuntu-14.04 映像)
  • 供应商是 Ansible
  • Guest OS python 版本为 2.7.9

以下场景:

  • 尝试使用 postgresql.conf 文件中的 ansible 模块更改 lineinfile
  • 我收到以下错误消息:msg: 'ascii' codec can't decode 字节 0x 在位置:序数不在 范围(128)

我修复了设置 PYTHONIOENCODING 环境变量的问题:

 export PYTHONIOENCODING="utf-8";

在 Vagrantfile 中。

即使这以某种方式解决了这个问题,我还是有一种奇怪的感觉,要么我错了,要么 Python 软件开发者错了,要么 Ansible 开发者错了,或者这是某种 Linus / Ubuntu 发行版复活节彩蛋,那就是正好拿出 2.7.9 Python 发行版来惹恼软件开发者,让他们思考而不是

严肃的问题是:“这个问题的真正解决方案是什么?”。

【问题讨论】:

  • 在您的本地终端中,输入echo $LC_CTYPE。然后,从该终端登录来宾,并输入echo $LC_CTYPE。结果如何?
  • @AntonisChistofides 由$ locale LANG=en_US.UTF-8 LANGUAGE=en_US 提供的多合一输出: LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US. UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
  • @AntonisChistofides 由$ locale LANG=en_US.UTF-8 LANGUAGE=en_US 提供的多合一输出: LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US. UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= 我不想承认 - 这是最好的我可以提供的格式。

标签: python ubuntu utf-8 ansible ascii


【解决方案1】:

问题可能是远程机器(即您的客人)没有生成语言环境en_US.UTF-8。在本地你有LC_CTYPE=en_US.UTF-8。当 ansible 开始在远程机器上运行时,它继承了相同的东西(ssh 这样做,也许还有 ansible,我不确定),所以,远程,ansible 也使用LC_CTYPE=en_US.UTF-8 运行。如果该语言环境不存在,Python 等程序将回退到默认语言环境 C,它只支持 ASCII。

为了避免这个问题,我确保生成了语言环境。我有一个"common" ansible 模块,它是为我的所有服务器列出的第一个模块,它执行一些对所有人都通用的基本配置。模块做的第一件事(因此在任何服务器上做的第一件事)是这样的:

- name: Install locales
  locale_gen: name={{ item }} state=present
  with_items:
    - en_US.UTF-8
    - en_DK.UTF-8

(我也生成en_DK.UTF-8 的原因不是我是丹麦人[我不是],而是我经常使用LC_TIME=en_DK.UTF-8,因为我喜欢ISO8601 中的日期。)

【讨论】:

  • 这并没有改变任何事情。 vagrant@vagrant:~$ localedef --list-archive 有输出 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8vagrant@vagrant:~$ localectl status 给出 System Locale: LANG=en_US.UTF-8 LANGUAGE=en_US: VC Keymap: n/a X11 Layout: us X11 Model: pc105
猜你喜欢
  • 2021-07-11
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2019-03-01
  • 2011-06-22
相关资源
最近更新 更多