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

2024-05-17 14:18:12 +08:00
 B4a1n

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

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

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

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

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

2039 次点击
所在节点    Python
27 条回复
Goooooos
2024-05-17 14:20:08 +08:00
websocket
B4a1n
2024-05-17 14:32:23 +08:00
@Goooooos 好像只有用轮询、长连接、websocket 这几种方法了
NoOneNoBody
2024-05-17 14:34:21 +08:00
pyqt 为何要远程登录?脚本不在同一机器运行?

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

streamlit 访问以后,直接读取这个变量并显示在网页上。
B4a1n
2024-05-17 14:47:35 +08:00
@NoOneNoBody 因为想丢到服务器上去跑,自己又想实时看执行的结果,所以想用 web 的形式来展示数据
B4a1n
2024-05-17 14:48:21 +08:00
@itskingname 好像关闭掉网页后 streamlit 对应的任务就停止执行了呀
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
2024-05-17 15:08:35 +08:00
如果你只会用 streamlit 那估计比较麻烦。

否则不如上 Flask
paopjian
2024-05-17 15:09:35 +08:00
没看懂呢,Python 起一个多线程不好了?懒得通信就共用一个文件什么的互相读
我写的启动 uvicorn 同时启动 http.server 下载文件测试:
<script src="https://gist.github.com/paopjian/bb836fad7806857cbc7b71e7d8e14a35.js"></script>
paopjian
2024-05-17 15:11:28 +08:00
knva
2024-05-17 15:23:42 +08:00
异步通信?
B4a1n
2024-05-17 15:38:49 +08:00
@paopjian 谢谢老哥 我参考一下
B4a1n
2024-05-17 15:39:11 +08:00
@NoOneNoBody 有道理 我觉得直接写读写 HTML 算逑
B4a1n
2024-05-17 15:41:10 +08:00
@ipwx 倒是会点 FastAPI Flask 我研究一下
B4a1n
2024-05-17 15:41:23 +08:00
@knva 有点麻烦...
knva
2024-05-17 16:14:49 +08:00
@B4a1n 这样吧,输出到文件内容中,再另外启动一个 py -3 -m http.server 服务就好了。
itskingname
2024-05-17 16:19:20 +08:00
@B4a1n #8 就不该用 streamlit 。换成 fastapi 吧。
Leon6868
2024-05-17 16:54:09 +08:00
可以了解一下 flask sse ,主线程通过 yield 或消息队列传递数据给 web 线程,然后通过 sse 输出。使用消息队列的话,对原本的代码应该侵入性极小

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1041624

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX