如何在网站上显示实时Python脚本输出?

4 投票
5 回答
6102 浏览
提问于 2025-04-15 15:22

我有一个Python脚本,每隔一两秒就会输出一些内容,但这个脚本运行完需要很长时间。我想搭建一个网站,让用户可以直接调用这个脚本,并且在脚本运行的时候,输出的内容能实时显示在屏幕上。

我不想让用户等到脚本完全结束后再看到结果,因为那样所有的输出会一次性显示出来。我试过这样做,但连接总是会超时。

我不知道这个过程叫做什么,也不知道我需要用什么术语。我该用CGI吗?还是Ajax?我需要一些详细的指导,谢谢!

如果有关系的话,我打算使用Nginx作为我的网页服务器。

5 个回答

0

根据http://tools.cherrypy.org/wiki/Comet上的内容,维基百科将Comet描述为一种网络应用模型。在这个模型中,浏览器发出一个长时间的HTTP请求,允许服务器向浏览器推送数据,而不需要浏览器主动请求。简单来说,Comet就是你需要的那种异步JavaScript技术,可以用来构建非常炫酷的AJAX应用。

下面的代码展示了如何使用CherryPy和jQuery来编写一个Comet应用。这个应用是一个网络界面,可以执行控制台的ping命令。选择ping命令作为例子是因为它在没有参数的情况下会一直运行下去。通常来说,在网络应用编程中执行这种永无止境的命令是不太好的做法,但使用CherryPy我们可以很轻松地处理这个问题:“请查看链接”

我正在尝试做完全相同的事情。目前我使用CherryPy,因为它很容易和我的脚本集成。

1

解决这个问题的方法是在脚本执行的特定时刻清空输出缓冲区。我之前只在PHP中用过flush()这个函数,但在Python中也有类似的做法,具体可以参考这个链接

在Python中,cgiprint()函数也会通过sys.stdout.flush()来清空输出缓冲区。大多数服务器会在脚本执行完成之前,先把输出内容存起来。如果你的脚本运行时间比较长,这种缓冲可能会让用户感到困惑,他们会想知道发生了什么。你可以选择定期清空缓冲区,或者让Python以无缓冲模式运行。要做到这一点,可以在命令行中加上-u这个选项,在你的shebang行中写成#!/usr/bin/python -u

2

首先,你的脚本必须输出一个头部信息:

Connection: Keep-Alive

这是因为浏览器需要知道它需要等待。

另外,你的脚本必须直接输出数据,而不是先存起来再一起输出。关于这个问题,StackOverflow上已经有相关的解答

撰写回答