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 · 1967 次点击
    这是一个创建于 448 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    27 条回复    2024-05-20 18:47:50 +08:00
    Goooooos
        1
    Goooooos  
       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   ·   实用小工具   ·   1719 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:27 · PVG 00:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.