从subprocess.Popen中打开另一个python 3进程。Popen将语言环境默认编码设置为ANSI_X3.4-1968,但仅在某些情况下

时间:2018-09-19 15:52:53

标签: python python-3.x encoding utf-8 subprocess

这真让我发疯。我有一个主要的python 3(3.5.2)驱动程序/程序,该程序使用子进程并弹出以生成其他我使用rpyc与之通信的python 3进程。这一直运行良好,尤其是在python 2中。

我已经成功转换为python 3,并验证了如果从终端运行所有这些进程都可以成功产生。

要从我的驱动程序启动它们,就像这样。

cmd_one = "/path/to/.virtualenv/venv_one/bin/python file_a.py"
cmd_two = "/path/to/.virtualenv/venv_two/bin/python file_b.py"
s_one = subprocess.Popen(cmd_one.split(), stdout=logfile, stderr=logfile)
s_two = subprocess.Popen(cmd_two.split(), stdtou=logfile, stderr=logfile)

这在Python 2.7中效果很好。

但是,当我升级到Python 3时,我看到一些无法理解的默认编码怪异的东西。对于cmd_one,它的效果很好-如果我执行

import locale
print(locale.getpreferredencoding()) 

它像我期望的那样返回UTF-8。但是,对于cmd_two,我似乎无缘无故得到ANSI_X3.4-1968,结果抛出了一堆unicodedecode错误。就像我说的那样,当在终端中生成时,cmd_one和cmd_two都可以正常工作,并使用正确的默认编码。

我已经进行了广泛的搜索,但这似乎是一个特例。我不想强制使用默认编码,因为我觉得这掩盖了其他问题。 file_b.py及其组成部分中是否有某些东西在看不到在终端中运行时以某种方式将编码设置为ANSII? file_b.py是一个大型Tensorflow项目的一部分,它使用了大约8个文件,但我查看了所有文件,但找不到任何东西。

这是在ubuntu 16.04上,默认的python 3是3.5.2,据我所知,无法通过Popen传递encoding='utf-8'

关于到底发生了什么的任何建议吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

在这里,我想我找到了一个解决方案,但我仍然不知道为什么我只需要针对此特定实例执行此操作-希望有人可以加油以便我能更好地理解这一点。

发件人:

https://webkul.com/blog/setup-locale-python3/

当我跑步时:

locale

在我的终端中,作为子过程,我得到:

LANG=en_US.UTF-8
LANGUAGE=
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=

对我来说,固定默认编码的方法是将语言环境LANGUAGE设置为en_US.en,将LC_ALL设置为en_US.UTF-8变量,然后使用Popen将它们直接传递给子进程

s = subprocess.Popen(cmd_two.split(), env={'LANGUAGE':'en_US.en', 'LC_ALL':'en_US.UTF-8'})

现在,它在我的子流程中正确地将默认编码标识为UTF-8,并且一切正常。

有人可以向我解释吗?我不需要对其他子流程执行此操作,它就可以正常工作。