师父们,我的项目前端 vue,后端 python flask 。
有个功能是点击一个按钮,会调用后端一个算法,执行时间比较长,1-2 分钟左右。期间想把控制台打印的东西显示在页面上。请问有什么插件或者思路吗?
补充一点就是调用算法的接口被封装过,有一部分是我 print()出来的;另一部分是方法中 print()出来的,这部分不能修改,所以还需要能获取当前控制台输出
1
nightwitch 2020-06-08 16:26:54 +08:00
输出重定向。
|
2
mart1nN OP @nightwitch 不好意思,可以详细一点吗,我完全没接触过
|
3
liyang5945 2020-06-08 16:37:25 +08:00 1
使用 websocket 即可,有数据打印时同时向客户端推送数据
|
4
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 全部完成了才一起输出 还有导致一些奇奇怪怪的问题 |
5
CEBBCAT 2020-06-08 16:41:05 +08:00
建议还是重写目标算法,让它返回字符串。
我 Python 不熟,我觉得你也没说得很清楚,看起来这个后端算法像是一个别人写到一半的函数,结果不是通过 return 返回的,二是 stdout |
6
rihkddd 2020-06-08 16:43:23 +08:00
看一下这个: http://websocketd.com/ ,websocketd --port=8080 your-program 就开了一个 websocket,前端脸上之后把终端的输出格式化一下展示就行了。
|
7
krapnik 2020-06-08 16:48:45 +08:00
|
8
netnr 2020-06-08 16:50:40 +08:00
前面有做一个视频切片的功能,程序调用 cmd 运行,输出内容显示到页面
1. 请求视频切片 生成一个缓存 KEY 并返回 2. CMD 输出的内容添加到数组,该数组 对应 生成的缓存 KEY 3. 写一个方法根据 缓存 KEY 读取输出的内容数组 缓存 KEY 可以根据传的参数 生成 MD5 之类的 |
9
rapiz 2020-06-08 16:54:13 +08:00 1
起个 websocket 然后用 dup2 把 stdout 重定向到 websocket 的 file descriptor
必须要起子进程运行这个算法然后 dup2,如果在 flask 进程内直接调用会导致 flask 的输出也被重定向,应该是无解的。 |
10
rapiz 2020-06-08 16:57:25 +08:00
(我是按照 socket 说的,实际上没用过 python 的 websocket,不过大概流程是这样的
|
11
Latin 2020-06-08 17:16:56 +08:00
subprocess 调用算法子进程输出通过 websocket 回调给前端,这样应该没有阻塞问题。
|
12
Vegetable 2020-06-08 17:33:30 +08:00
可以使用 stream 的方式返回 stdout,怎么实时显示的问题我还没想过
https://gist.github.com/luliangce/e587238ed619084cef9ddeeab7d4ece8 |
13
xcstream 2020-06-08 17:49:58 +08:00
print 绑定 websocket
|
14
Vegetable 2020-06-08 17:57:42 +08:00
|
15
redbuck 2020-06-08 18:03:29 +08:00
你是要调试?
可以用 eruda |
16
mart1nN OP @all 谢谢师父们建言献策,怪我问题描述不清。简单来说是这样:点个按钮,后端调用一个神经网络的模型对一堆数据识别,执行时间比较长,然后前端要把执行过程中控制台打印的东西显示出来比方说:model.summary()打印出来的网络结构啥的。给老师们看到我这个玩意儿在跑。那一个东西打比方我设想的是有点像阿里云官网连接了远程服务器,然后那个黑色部分能显示那样。
我现在整了一个 txt 文件,然后把输出重定向到了这个文件中,开了一个 websocket 服务,循环读取文件里的信息然后推给前端显示。勉强完成这个功能,希望答辩的时候老师不要问太细。 这样下来还有一个问题,就是异步启动 websocket 服务,我这里一直报 There is no current event loop in thread 'Thread-XXX'(师父们有空可以看看我最新提的那个问题,代码啥的都贴那儿了) |