如何把控制台打印的数据显示在页面上

2020-06-08 16:23:40 +08:00
 mart1nN

师父们,我的项目前端 vue,后端 python flask 。

有个功能是点击一个按钮,会调用后端一个算法,执行时间比较长,1-2 分钟左右。期间想把控制台打印的东西显示在页面上。请问有什么插件或者思路吗?

补充一点就是调用算法的接口被封装过,有一部分是我 print()出来的;另一部分是方法中 print()出来的,这部分不能修改,所以还需要能获取当前控制台输出

3973 次点击
所在节点    Python
16 条回复
nightwitch
2020-06-08 16:26:54 +08:00
输出重定向。
mart1nN
2020-06-08 16:32:51 +08:00
@nightwitch 不好意思,可以详细一点吗,我完全没接触过
liyang5945
2020-06-08 16:37:25 +08:00
使用 websocket 即可,有数据打印时同时向客户端推送数据
ohao
2020-06-08 16:39:17 +08:00
这个可以理解为 2 个逻辑吧?

首先是后端的输出 , 就是把执行结果或者过程,重定向输出到一个日志文件里
然后后端读取这个日志 提供一个接口 , 前端拉取这个接口的内容打印出来

你可以看下 whm/cpanel 的 builder (商业软件), 国内 BT 的就是 python 写的 他那个安装过程和结果 就是这样做的

如果你直接打印的话 可能有前端浏览器缓存 , 后端 WS 的缓存 不能实时输出
就是 1 2 3 你期望 输出 1 完成然后输出 2 完成在输出 3 但是它会 1 2 3 全部完成了才一起输出
还有导致一些奇奇怪怪的问题
CEBBCAT
2020-06-08 16:41:05 +08:00
建议还是重写目标算法,让它返回字符串。

我 Python 不熟,我觉得你也没说得很清楚,看起来这个后端算法像是一个别人写到一半的函数,结果不是通过 return 返回的,二是 stdout
rihkddd
2020-06-08 16:43:23 +08:00
看一下这个: http://websocketd.com/ ,websocketd --port=8080 your-program 就开了一个 websocket,前端脸上之后把终端的输出格式化一下展示就行了。
krapnik
2020-06-08 16:48:45 +08:00
netnr
2020-06-08 16:50:40 +08:00
前面有做一个视频切片的功能,程序调用 cmd 运行,输出内容显示到页面

1. 请求视频切片 生成一个缓存 KEY 并返回
2. CMD 输出的内容添加到数组,该数组 对应 生成的缓存 KEY
3. 写一个方法根据 缓存 KEY 读取输出的内容数组

缓存 KEY 可以根据传的参数 生成 MD5 之类的
rapiz
2020-06-08 16:54:13 +08:00
起个 websocket 然后用 dup2 把 stdout 重定向到 websocket 的 file descriptor
必须要起子进程运行这个算法然后 dup2,如果在 flask 进程内直接调用会导致 flask 的输出也被重定向,应该是无解的。
rapiz
2020-06-08 16:57:25 +08:00
(我是按照 socket 说的,实际上没用过 python 的 websocket,不过大概流程是这样的
Latin
2020-06-08 17:16:56 +08:00
subprocess 调用算法子进程输出通过 websocket 回调给前端,这样应该没有阻塞问题。
Vegetable
2020-06-08 17:33:30 +08:00
可以使用 stream 的方式返回 stdout,怎么实时显示的问题我还没想过
https://gist.github.com/luliangce/e587238ed619084cef9ddeeab7d4ece8
xcstream
2020-06-08 17:49:58 +08:00
print 绑定 websocket
Vegetable
2020-06-08 17:57:42 +08:00
搞定了
redbuck
2020-06-08 18:03:29 +08:00
你是要调试?
可以用 eruda
mart1nN
2020-06-09 23:53:25 +08:00
@all 谢谢师父们建言献策,怪我问题描述不清。简单来说是这样:点个按钮,后端调用一个神经网络的模型对一堆数据识别,执行时间比较长,然后前端要把执行过程中控制台打印的东西显示出来比方说:model.summary()打印出来的网络结构啥的。给老师们看到我这个玩意儿在跑。那一个东西打比方我设想的是有点像阿里云官网连接了远程服务器,然后那个黑色部分能显示那样。

我现在整了一个 txt 文件,然后把输出重定向到了这个文件中,开了一个 websocket 服务,循环读取文件里的信息然后推给前端显示。勉强完成这个功能,希望答辩的时候老师不要问太细。

这样下来还有一个问题,就是异步启动 websocket 服务,我这里一直报 There is no current event loop in thread 'Thread-XXX'(师父们有空可以看看我最新提的那个问题,代码啥的都贴那儿了)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/679755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX