请问 Python 死循环中的执行结果如何展示到浏览器上显示 - V2EX
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
B4a1n
V2EX    Python

请问 Python 死循环中的执行结果如何展示到浏览器上显示

  •  
  •   B4a1n 2024-05-17 14:18:12 +08:00 2162 次点击
    这是一个创建于 579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有个 Python 的脚本是需要死循环不停的获取数据处理完成后再展示出来,用 PyQT 的话需要需要登陆远程桌面才能看数据

    用了 streamlit ,发现必须一直打开浏览器才能执行脚本,关闭浏览器就不执行了

    用通知的方法消息几秒一条太频繁了

    要是直接死循环里修改 HTML 倒是可以,但是要不停的让浏览器自动刷新或者手动刷新浏览器

    请问 V2 的各位大神,还有别的方便一点的方法嘛

    27 条回复    2024-05-20 18:47:50 +08:00
    uNoBrain
        1
    uNoBrain  
       2024-05-17 14:20:08 +08:00
    websocket
    B4a1n
        2
    B4a1n  
    OP
       2024-05-17 14:32:23 +08:00
    @Goooooos 好像只有用轮询、长连接、websocket 这几种方法了
    NoOneNoBody
        3
    NoOneNoBody  
       2024-05-17 14:34:21 +08:00
    pyqt 为何要远程登录?脚本不在同一机器运行?

    感觉重点在消息筛选,而不是显示,你这里写已经有多种方法显示了,显然如何显示不是问题
    NoOneNoBody
        4
    NoOneNoBody  
       2024-05-17 14:39:37 +08:00   1
    另外吐槽一下,不要用“死循环”这样的词,感觉像是循环会造成问题,应该用“无限循环”这样感觉好些
    B4a1n
        5
    B4a1n  
    OP
       2024-05-17 14:46:17 +08:00
    @NoOneNoBody 老哥说的有理
    itskingname
        6
    itskingname  
       2024-05-17 14:47:00 +08:00
    streamlit + 多线程可以解决。启动程序以后,创建一个子线程来无限循环。结果写入到一个变量里面。

    streamlit 访问以后,直接读取这个变量并显示在网页上。
    B4a1n
        7
    B4a1n  
    OP
       2024-05-17 14:47:35 +08:00
    @NoOneNoBody 因为想丢到服务器上去跑,自己又想实时看执行的结果,所以想用 web 的形式来展示数据
    B4a1n
        8
    B4a1n  
    OP
       2024-05-17 14:48:21 +08:00
    @itskingname 好像关闭掉网页后 streamlit 对应的任务就停止执行了呀
    NoOneNoBody
        9
    NoOneNoBody  
       2024-05-17 15:08:00 +08:00
    本地的话,pyqt 起一个 qthread 执行循环,在循环内 emit 消息,主线程接受处理并显示
    异地的话,要保持一个长连接通讯,然后就可以处理消息了,又或者文件方式发送/接受
    如果消息是简单的 html ,textedit 支持 html4 ,可以直接显示,如果复杂一些也可以用个 webengine/webview
    如果不是 html ,自己写个 parser

    所以重点还是消息过滤,次/几秒,频率太高的话,记入 log 或者其他,筛选显示级别,如果不重要不需记录,可以建个内存 io ,stringio 或者 ram sqlite ,必要时记录,不必要的话定时清空

    看上面说的,消息基本都能传到且完整,所以怎么分、切割再合并显示都是小问题,可能美观和格式调整更耗时呢
    ipwx
        10
    ipwx  
       2024-05-17 15:08:35 +08:00
    如果你只会用 streamlit 那估计比较麻烦。

    否则不如上 Flask
    paopjian
        11
    paopjian  
       2024-05-17 15:09:35 +08:00
    没看懂呢,Python 起一个多线程不好了?懒得通信就共用一个文件什么的互相读
    我写的启动 uvicorn 同时启动 http.server 下载文件测试:
    <script src="https://gist.github.com/paopjian/bb836fad7806857cbc7b71e7d8e14a35.js"></script>
    paopjian
        12
    paopjian  
       2024-05-17 15:11:28 +08:00
    knva
        13
    knva  
       2024-05-17 15:23:42 +08:00
    异步通信?
    B4a1n
        14
    B4a1n  
    OP
       2024-05-17 15:38:49 +08:00
    @paopjian 谢谢老哥 我参考一下
    B4a1n
        15
    B4a1n  
    OP
       2024-05-17 15:39:11 +08:00
    @NoOneNoBody 有道理 我觉得直接写读写 HTML 算逑
    B4a1n
        16
    B4a1n  
    OP
       2024-05-17 15:41:10 +08:00
    @ipwx 倒是会点 FastAPI Flask 我研究一下
    B4a1n
        17
    B4a1n  
    OP
       2024-05-17 15:41:23 +08:00
    @knva 有点麻烦...
    knva
        18
    knva  
       2024-05-17 16:14:49 +08:00
    @B4a1n 这样吧,输出到文件内容中,再另外启动一个 py -3 -m http.server 服务就好了。
    itskingname
        19
    itskingname  
       2024-05-17 16:19:20 +08:00
    @B4a1n #8 就不该用 streamlit 。换成 fastapi 吧。
    Leon6868
        20
    Leon6868  
       2024-05-17 16:54:09 +08:00
    可以了解一下 flask sse ,主线程通过 yield 或消息队列传递数据给 web 线程,然后通过 sse 输出。使用消息队列的话,对原本的代码应该侵入性极小
    B4a1n
        21
    B4a1n  
    OP
       2024-05-17 17:24:12 +08:00
    @Leon6868 正在研究中。。。。感觉在 AI 的帮助下 websockt 好像也不是很麻烦。。。。
    Opportunity
        22
    Opportunity  
       2024-05-17 20:52:15 +08:00
    浏览器自动刷新也没啥问题吧,虽然办法有点古老,但是也很有效啊,https://www.ssllabs.com/ssltest/analyze.html 不就是这个策略
    B4a1n
        23
    B4a1n  
    OP
       2024-05-17 21:23:46 +08:00
    @Opportunity 谢谢老哥 我学习一下
    iOCZS
        24
    iOCZS  
       2024-05-18 15:10:58 +08:00
    Eventsource
    CnpPt
        25
    CnpPt  
       2024-05-18 21:02:53 +08:00
    这个工具应该能解决楼主的需求
    https://github.com/joewalnes/websocketd
    treblex
        26
    treblex  
       2024-05-18 23:49:44 +08:00
    sse 很简单
    Latin
        27
    Latin  
       2024-05-20 18:47:50 +08:00
    SSE
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3746 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 05:10 PVG 13:10 LAX 21:10 JFK 00:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86