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

时间:2019-02-26 17:16:07

标签: python django python-3.x unicode subprocess

我有python脚本,在执行时向终端显示Unicode消息。所以我想在进程运行时在网页上显示该消息。我可以通过Popen程序包运行脚本,但是接收脚本输出的它的communication()方法无法接收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()

1 个答案:

答案 0 :(得分: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)