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