我有一个Python脚本,每两秒钟输出一次,但需要很长时间才能完成。我想建立一个网站,以便有人可以直接调用脚本,并在脚本运行时将输出发送到屏幕。
我不希望用户等到脚本完全完成,因为所有输出都会立即显示。我也试过了,连接总是超时。
我不知道这个过程叫什么,我正在寻找什么术语,以及我需要使用什么。 CGI?阿贾克斯?这里需要一些认真的指导,谢谢!
如果重要,我打算使用Nginx作为网络服务器。
答案 0 :(得分:2)
首先 - 您的脚本必须输出标题:
连接:Keep-Alive
因为浏览器必须知道它必须等待。
您的脚本必须输出数据而不进行缓冲。 stackoverflow有already answered this question。
答案 1 :(得分:1)
解决方案是在脚本执行中的选择点刷新输出缓冲区 - 我只是通过flush()在PHP中完成此操作,但这看起来像the Python equivalent:
cgiprint()也会刷新输出 缓冲区使用 sys.stdout.flush()。最 服务器缓冲脚本的输出 直到它完成。长跑 脚本,8缓冲输出可能 挫败你的用户,谁会想 发生了什么。你也可以 定期冲洗你的缓冲区,或运行 Python处于无缓冲模式。该 执行此操作的命令行选项是-u, 您可以指定为 你的shebang线
#!/usr/bin/python -u
。
答案 2 :(得分:0)
答案 3 :(得分:0)
来自http://tools.cherrypy.org/wiki/Comet “维基百科将Comet描述为”,这是一个描述Web应用程序模型的新词,其中一个长期持有的HTTP请求允许Web服务器将数据推送到浏览器,而浏览器没有明确请求它。“。换句话说,Comet是那样的异步Javascript mojo你需要构建非常精美的AJAX应用程序。
以下代码演示了如何使用CherryPy和jQuery编写Comet应用程序。它是控制台ping命令的Web界面。为此示例选择了ping命令,因为如果没有参数,它将无限期地运行。在Web应用程序编程方面,执行永无止境的命令通常是一个很大的禁忌,但使用CherryPy,我们可以很容易地处理这个问题:“SEE LINK
我正在尝试做同样的事情。到目前为止,我使用的是cherrypy,因为它很容易与我的脚本集成。
答案 4 :(得分:0)
正如其他一些人所建议的那样,你可以使用keep alive连接而不是“return”语句使用yield语句而不是“print”语句也使用yield语句。这基本上会将python脚本中发生的所有内容显示在网站页面上。
经过广泛的搜索和测试后,我会建议nginx作为gevent& amp;的逆向代理。瓶子作为后端,让人高枕无忧,因为nginx永远不会提供python源文件。