推荐学习书目
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 · Jun 8, 2020 · 4751 views
    This topic created in 2189 days ago, the information mentioned may be changed or developed.

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

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

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

    16 replies    2020-06-09 23:53:25 +08:00
    nightwitch
        1
    nightwitch  
       Jun 8, 2020
    输出重定向。
    mart1nN
        2
    mart1nN  
    OP
       Jun 8, 2020
    @nightwitch 不好意思,可以详细一点吗,我完全没接触过
    liyang5945
        3
    liyang5945  
       Jun 8, 2020   ❤️ 1
    使用 websocket 即可,有数据打印时同时向客户端推送数据
    ohao
        4
    ohao  
       Jun 8, 2020
    这个可以理解为 2 个逻辑吧?

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

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

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

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

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

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

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

    这样下来还有一个问题,就是异步启动 websocket 服务,我这里一直报 There is no current event loop in thread 'Thread-XXX'(师父们有空可以看看我最新提的那个问题,代码啥的都贴那儿了)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2910 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 14:12 · PVG 22:12 · LAX 07:12 · JFK 10:12
    ♥ Do have faith in what you're doing.