这让我发疯。我有一个主要的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…