V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mart1nN
V2EX  ›  Python

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

  •  
  •   mart1nN · 2020-06-08 16:23:40 +08:00 · 3732 次点击
    这是一个创建于 1388 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    16 条回复    2020-06-09 23:53:25 +08:00
    nightwitch
        1
    nightwitch  
       2020-06-08 16:26:54 +08:00
    输出重定向。
    mart1nN
        2
    mart1nN  
    OP
       2020-06-08 16:32:51 +08:00
    @nightwitch 不好意思,可以详细一点吗,我完全没接触过
    liyang5945
        3
    liyang5945  
       2020-06-08 16:37:25 +08:00   ❤️ 1
    使用 websocket 即可,有数据打印时同时向客户端推送数据
    ohao
        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 全部完成了才一起输出
    还有导致一些奇奇怪怪的问题
    CEBBCAT
        5
    CEBBCAT  
       2020-06-08 16:41:05 +08:00
    建议还是重写目标算法,让它返回字符串。

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

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

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

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

    这样下来还有一个问题,就是异步启动 websocket 服务,我这里一直报 There is no current event loop in thread 'Thread-XXX'(师父们有空可以看看我最新提的那个问题,代码啥的都贴那儿了)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5481 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:13 · PVG 16:13 · LAX 01:13 · JFK 04:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.