Python语句输出重定向到网页前端
Python中的输出语句主要有两种:print输出语句和外部文件输出语句。本文分为两部分,第一部分:两种输出语句的获取;第二部分:语句的前端刷新。
一、输出语句获取
1.print输出语句获取
sys.stdout是python中的标准输出流,这个标准输出流默认是映射到打开脚本的窗口的,所以,我们的print操作会把字符打印到屏幕上。
因此想要获取print语句的输出,只需要将sys.stdout映射到我们指定的文件或变量中即可。
##将print输出内容重定位到txt文件中
import sys
sys.stdout = open('test.txt','w')
print("text")
##将print输出内容重定位到list变量中
buffer = [] ##建立list储存print输出变量
class TextArea(object): ##建立对象,添加输出流需要的write写方法,和清空缓存的flush方法
def write(self, *args):
buffer.append(args) ##此时的args为元组类型
def flush(self):
buffer = []
sys.stdout = TextArea() ##将输出定位到指定的list变量
print("test") ##此时语句输出到buffer列表中
sys.stdout = sys.__stdout__ ##输出恢复为控制台,即默认的输出位置。
2.外部文件输出语句
我们以可执行文件为例,获取输出信息
outMessage = []
Comandline = "test.exe"
# 建立进程执行可行性文件,使用管道获得可执行文件的输出(进程之间的通信)
p = subprocess.Popen(Comandline, shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while p.poll() is None:
line = p.stdout.readline().decode("utf8")
if line == "//n": ##跳过空行
continue
outMessage = outMessage + line ##逐行取出
通过以上两种方法,我们已经获取到了控制台的输出信息,并将其放在指定变量中,接下来,我们会通过js语句对网页的输出部分进行定时异步刷新,使用了ajax的网址刷新方法。
前端刷新
1.建立textarea,用于语句显示
<div>
<textarea class = "editor_text" id = "runMess" name = "RunMessage" rows="15" cols="40" onfocus="this.scrollTop = this.scrollHeight"></textarea>
</div>
2.建立后端接口
def outMess(request): ##注意将outMess放入到路由中,否则无法与前端绑定
outMessage = buffer ##此处的buffer为输出信息,将它以json的形式送给前端
return JsonResponse({'outMessage': outMessage})
3.利用js建立刷新函数
function outMess(){
/* alert(DATA.user_rule); */
$.ajax
({
url:'/Analyzer/outMess/',//此处为后端函数的路由
type:'POST',
data:{}, //此处data为前端发给后端的数据
success:function(data) //此处data为后端返回的json数据
{
var outMessTextarea = document.getElementById("runMess");
outMessTextarea.innerHTML = data.outMessage;
outMessTextarea.scrollTop=outMessTextarea.scrollHeight;//始终置于最后一行
}
});
}
4.定时器刷新设置,注意在合适位置放入打开定时器的指令,并在输出结束后将定时器关闭
var timer1 = setInterval(outMess,1000); ///打开定时器,每1000毫秒刷新那一次,每次均会执行js函数:outMess
clearInterval(timer1); //关闭定时器,不再继续刷新输出
有问题欢迎私信、留言。
祝好!