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

这让我发疯。我有一个主要的python 3(3.5.2)驱动程序/程序,使用子进程并通过popen生成了我使用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'

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

谢谢。

参考方案

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

从:

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,并且一切正常。

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

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…

Python:传递记录器是个好主意吗? - python

我的Web服务器的API日志如下:started started succeeded failed 那是同时收到的两个请求。很难说哪一个成功或失败。为了彼此分离请求,我为每个请求创建了一个随机数,并将其用作记录器的名称logger = logging.getLogger(random_number) 日志变成[111] started [222] start…

Python-Excel导出 - python

我有以下代码:import pandas as pd import requests from bs4 import BeautifulSoup res = requests.get("https://www.bankier.pl/gielda/notowania/akcje") soup = BeautifulSoup(res.cont…