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 · 28 天前 · 1276 次点击

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

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

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

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

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

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

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

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

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

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

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