推荐学习书目
› 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 · May 17, 2024 · 5075 views
    This topic created in 899 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

    否则不如上 Flask
    paopjian
    paopjian
    May 17, 2024
    11
    没看懂呢,Python 起一个多线程不好了?懒得通信就共用一个文件什么的互相读
    我写的启动 uvicorn 同时启动 http.server 下载文件测试:
    <script src="https://gist.github.com/paopjian/bb836fad7806857cbc7b71e7d8e14a35.js"></script>
    knva
    knva
    May 17, 2024
    13
    异步通信?
    B4a1n
    B4a1n
    OP
    May 17, 2024
    14
    @paopjian 谢谢老哥 我参考一下
    B4a1n
    B4a1n
    OP
    May 17, 2024
    15
    @NoOneNoBody 有道理 我觉得直接写读写 HTML 算逑
    B4a1n
    B4a1n
    OP
    May 17, 2024
    16
    @ipwx 倒是会点 FastAPI Flask 我研究一下
    B4a1n
    B4a1n
    OP
    May 17, 2024
    17
    @knva 有点麻烦...
    knva
    knva
    May 17, 2024
    18
    @B4a1n 这样吧,输出到文件内容中,再另外启动一个 py -3 -m http.server 服务就好了。
    itskingname
    itskingname
    May 17, 2024
    19
    @B4a1n #8 就不该用 streamlit 。换成 fastapi 吧。
    Leon6868
    Leon6868
    May 17, 2024
    20
    可以了解一下 flask sse ,主线程通过 yield 或消息队列传递数据给 web 线程,然后通过 sse 输出。使用消息队列的话,对原本的代码应该侵入性极小
    B4a1n
    B4a1n
    OP
    May 17, 2024
    21
    @Leon6868 正在研究中。。。。感觉在 AI 的帮助下 websockt 好像也不是很麻烦。。。。
    Opportunity
    Opportunity
    May 17, 2024
    22
    浏览器自动刷新也没啥问题吧,虽然办法有点古老,但是也很有效啊,https://www.ssllabs.com/ssltest/analyze.html 不就是这个策略
    B4a1n
    B4a1n
    OP
    May 17, 2024
    23
    @Opportunity 谢谢老哥 我学习一下
    iOCZS
    iOCZS
    May 18, 2024
    24
    Eventsource
    CnpPt
    CnpPt
    May 18, 2024
    25
    这个工具应该能解决楼主的需求
    https://github.com/joewalnes/websocketd
    treblex
    treblex
    May 18, 2024
    26
    sse 很简单
    Latin
    Latin
    May 20, 2024
    27
    SSE
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1675 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 23:39 · PVG 07:39 · LAX 15:39 · JFK 18:39
    ♥ Do have faith in what you're doing.