我有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()
答案 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)