【问题标题】:What's easiest way to get Python script output on the web?在网络上获取 Python 脚本输出的最简单方法是什么?
【发布时间】:2009-04-08 19:31:04
【问题描述】:

我有一个连续运行的 python 脚本。它每 30 秒输出 2 行信息。我希望能够在网络上查看此输出。特别是,我希望网站自动更新(每 30 秒在页面/网站顶部添加新输出,而无需刷新页面)。

我知道我可以使用 javascript 来做到这一点,但是否有仅基于 python 的解决方案?即使有,javascript是要走的路吗?如果需要,我非常愿意学习 javascript,但如果没有,我想继续专注于 python。

很抱歉这个基本问题,但我仍然对网络编程一无所知。

谢谢!

【问题讨论】:

  • 非常感谢所有回复。这确实只是一个方便的东西 - 不是公共消费的网站。我怀疑我最终会选择 javascript 路线,但我也会探索其他选项。
  • 经过一番研究并阅读了下面所有的 cmets,使用 javascript/jquery 似乎是要走的路。 html 元刷新标签选项对我有用(谢谢!!)但从视觉上看,我正在寻找诸如朋友馈送或 gmail 的测试版之类的东西。如果有人对前面有任何建议,请告诉我。再次感谢您的帮助

标签: javascript python


【解决方案1】:

这个问题似乎有两件事。

  1. 网络上的演示文稿。这在 Python 中很容易做到——使用 Django 或 TurboGears 或任何基于 Python 的 Web 框架。

  2. 刷新网页以显示新数据。这可以通过两种方式完成。

    • 一些花哨的 Javascript 来刷新。

    • 一些花哨的 HTML 来刷新页面。 meta refresh 标签就是你想要的。如果你这样做了,你就有了一个全 Python 的解决方案。

【讨论】:

  • 为什么不在输出之间刷新缓冲区?
【解决方案2】:

如果您想要一种非常简单的方法来将 Python 脚本中的数据打印到网页并自动更新,您可以从脚本中打印。例如,将 Apache 与以下 Python CGI 脚本一起使用:

#!/usr/bin/python 

import time
import sys
import random

def write(inline=''):
    sys.stdout.write(inline)
    sys.stdout.write('\r\n')
    sys.stdout.flush()

#prints out random digits between 1 and 1000 indefinitely
write("Content-type: text/html\r\n")
i = 0
while(True):
    i = i + 1
    time.sleep(1)
    write(str(i) + "<br />")

如果我在浏览器中导航到该页面(Firefox,不知道其他浏览器在缓冲等方面的工作方式是否不同),它会不断打印数字。请注意,它按顺序打印,因此较新的数据位于底部而不是顶部,但它可能会根据您想要做什么而起作用。

如果这不是您真正需要的,唯一的其他方法是自动刷新页面(在 iframe 中或整个页面中)或使用 javascript 来获取数据。

您可以在 iframe 或页面 HTML 源代码中使用元刷新标记,并且您的 CGI 可以在每次刷新时打印新数据。或者,您可以使用带有 XMLHTTPRequest 的 javascript 来读取新数据,而无需刷新可视页面。

【讨论】:

  • 这称为 Comet,但不能保证适用于所有浏览器。 (并且可能存在超时问题。)
  • 所有优点,这真的取决于 OP 正在寻找的细节。我的猜测是一些 javascript 会是更好的解决方案。
  • 使用while(i&lt;10),在网页上,它在最后显示整个输出,而不是实时的中间级别。有什么办法一张一张打印,不是全部打印完?
【解决方案3】:

您可以使用Comet,但我强烈建议您不要这样做。我只想写一个简短的 Javascript,使用 jQuery 这真的很简单。

另一种可能性是使用每 30 秒重新加载一次的 iframe,这会阻止整个页面重新加载。

【讨论】:

    【解决方案4】:

    如果你想完全在 python 中完成,你可以使用pyjamas

    它直接从python代码生成javascript,所以你完全避免自己编写javascript。

    【讨论】:

      【解决方案5】:

      您需要以一种或另一种方式使用 Javascript 来进行 30 秒的刷新。或者,您可以设置每 30 秒刷新一次元标记以重定向到当前页面,但 Javascript 路由将防止页面闪烁。

      【讨论】:

        【解决方案6】:

        将您的输出写入日志文件,并通过 Web 服务器将日志文件加载到浏览器。如果您需要自动刷新,请创建一个带有标签的模板 HTML 文件以每 15 秒刷新一次:

        <META HTTP-EQUIV="refresh" CONTENT="15">
        

        并使用server side include 将日志文件包含在页面上。

        【讨论】:

          【解决方案7】:

          也许"long polling" 就是您要找的东西?

          长轮询可以描述为“HTTP推送”,基本上你有一个通过网络服务器提供的(Python)脚本,它只在可用时输出数据。然后你尝试通过Javascript异步加载这个页面,当它重试失败,当它成功时你对数据做一些事情(通常显示它)

          my answer 中的示例是用 PHP 编写的,但实际上只有 2 个命令(sleep(rand(1, 10)) - 其他几个用于演示 javascript 的错误处理)

          嗯,并不是相当那么简单.. 你不能只通过 Apache 提供 CGI python 脚本,因为你会用完工作线程,而网络服务器也不会能够接受任何进一步的连接..所以,你需要使用更专业的服务器..

          • twisted Python 框架非常适合此类服务器 - 以下两个服务器顺便说一下都是用它编写的
          • cometd - “最有名的”长轮询服务器,虽然我在 Python 实现方面从来没有太多运气
          • slosh - 使用起来似乎非常简单。在 Python 中实现,尽管您可以通过 HTTP 请求与之交互

          【讨论】:

            【解决方案8】:

            JavaScript 是将这种交互性添加到网站的主要方式。您可以制作后端 Python,但客户端必须使用 JavaScript AJAX 调用来更新页面。 Python 不能在浏览器中运行,所以如果你只想使用 Python,那就不走运了。

            (也可以使用 Flash 或 Java 小程序,但对于看似很小的问题,这是一个相当重量级的解决方案。)

            【讨论】:

            • 虽然老了,但请扩展 Python 和 AJAX 交互。最好没有 Django、Jinja 和 Flask。听起来 Python 在后端方面可以做与 PHP 相同的事情,但是当我在线搜索时,没有人以准系统的方式做这件事。我真的认为这可能是一个简单的脚本。
            【解决方案9】:

            这是一个真正的网络应用程序吗?或者这对您在浏览器中查看输出是否方便?如果为了方便起见,您可以考虑使用 mod_python。

            mod_python 是 apache 网络服务器的扩展,它在网络服务器中嵌入了一个 python 解释器(因此脚本运行在服务器端)。它很容易让你在本地或为了你自己的方便做这种事情。然后您可以使用 mod python 运行脚本并让处理程序发布您的结果。您也可以轻松实现刷新,但我不知道该怎么做。

            希望这会有所帮助...查看 mod_python。一切都配置好后,这还不算太糟糕。

            【讨论】:

              猜你喜欢
              • 2010-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-05
              • 1970-01-01
              相关资源
              最近更新 更多