如何通过Popen.communicate()传递unicode文本消息?

问题描述 投票:0回答:1

我有python脚本,在执行时向终端显示Unicode消息。所以我想在进程运行时在网页中显示该消息。我能够通过Popen包运行脚本,但是它接收脚本输出的communic()方法无法接收Unicode文本。

UnicodeEncodeError: \'charmap\' codec can\'t encode characters in position 12-15: character maps to <undefined>\r\n'

所以我尝试将消息作为字节传递,它可以通过它,但我不能解码它以后讨论这个问题转到:How to decode a string representation of a bytes object?

但是现在在这篇文章中我想知道通过Popen.communicate()传递Unicode文本的方法我的代码在这里

from subprocess import Popen, PIPE
scripts = os.path.join(os.getcwd(), 'scripts')
p = Popen(["python", "tasks.py"],bufsize=0, cwd=scripts, stdout=PIPE, stderr=PIPE)
out,err = p.communicate()
python django python-3.x unicode subprocess
1个回答
2
投票

@snakecharmerb的评论是解决方案。

您必须在启动子Python进程之前设置PYTHONIOENCODING变量,以允许它以UTF-8正确编码其输出。然后你只需解码你在父母中得到的东西:

from subprocess import Popen, PIPE
import os

os.environ['PYTHONIOENCODING'] = 'UTF-8'
scripts = os.path.join(os.getcwd(), 'scripts')
p = Popen(["python", "tasks.py"],bufsize=0, cwd=scripts, stdout=PIPE, stderr=PIPE)
out,err = p.communicate()
print(out.decode())

如果你有Python> = 3.6,你可以直接退出并作为unicode字符串犯错误:

os.environ['PYTHONIOENCODING'] = 'UTF-8'
scripts = os.path.join(os.getcwd(), 'scripts')
p = Popen(["python", "tasks.py"],bufsize=0, cwd=scripts, stdout=PIPE, stderr=PIPE, encoding='UTF-8')
out,err = p.communicate()
print(out)
© www.soinside.com 2019 - 2024. All rights reserved.