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

216 天前
 B4a1n

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

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

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

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

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

1611 次点击
所在节点    Python
27 条回复
Goooooos
216 天前
websocket
B4a1n
216 天前
@Goooooos 好像只有用轮询、长连接、websocket 这几种方法了
NoOneNoBody
216 天前
pyqt 为何要远程登录?脚本不在同一机器运行?

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

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

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

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

否则不如上 Flask
paopjian
216 天前
没看懂呢,Python 起一个多线程不好了?懒得通信就共用一个文件什么的互相读
我写的启动 uvicorn 同时启动 http.server 下载文件测试:
<script src="https://gist.github.com/paopjian/bb836fad7806857cbc7b71e7d8e14a35.js"></script>
paopjian
216 天前
knva
216 天前
异步通信?
B4a1n
216 天前
@paopjian 谢谢老哥 我参考一下
B4a1n
216 天前
@NoOneNoBody 有道理 我觉得直接写读写 HTML 算逑
B4a1n
216 天前
@ipwx 倒是会点 FastAPI Flask 我研究一下
B4a1n
216 天前
@knva 有点麻烦...
knva
216 天前
@B4a1n 这样吧,输出到文件内容中,再另外启动一个 py -3 -m http.server 服务就好了。
itskingname
216 天前
@B4a1n #8 就不该用 streamlit 。换成 fastapi 吧。
Leon6868
216 天前
可以了解一下 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