将Python脚本的状态流式传输到网站

时间:2010-09-17 21:47:45

标签: javascript python streaming real-time

我有一个简单的工作流[Step 0]->[1]->[2]->...->[Step N]。主程序知道它当前所处的步骤(状态)。

我希望将这个实时流式传输到一个网站(在局域网中),这样当我的同事打开时,比如http://thecomputer:8000,他们就能看到我们工作流当前状态的实时呈现有任何相关细节。

我已经考虑将脚本的状态写入StringIO对象(流式传输到它)并使用Javascript刷新浏览器,但老实说我真的不知道如何实际执行此操作

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

您可以让python脚本编写一个xml文件,您可以在网页中找到ajax请求,并从中获取状态信息。

答案 1 :(得分:0)

如果您只是一个快速的解决方案而不是一个完整的网页,请查看SimpleHTTPServer您可以将文件形式的状态信息写入目录,然后更新以供其他人查看。

不漂亮,但非常快速而且非常容易。

对于演示,只需键入python -m SimpleHTTPServer这将创建一个地址为http://[your computer's name or IP]:8000的网页,其中包含启动时当前工作目录的内容。这些文件是热链接的。如果单击某个文件,它将显示在浏览器中;如果单击目录,则更改为该目录并列出其内容。

供您使用时,您可以从空目录开始,并创建与您要报告的步骤匹配的文件。您可以将文件命名为您的步骤,例如“step 1.txt”,以及该文件中的更详细信息。步骤1可以是脚本在步骤1完成时创建的目录,等等。

或者,查看Twisted,这将允许您直接从Python脚本提供HTTP请求。

如果/想要变得更加漂亮,可以使用基本相同的方法。从python脚本中,将输出写入空目录中的文件。从带有PHP的Web服务器,编写一个简单的脚本来检查该目录并显示找到的内容。将页面上的刷新间隔设置为某个值,它将在查看器的浏览器中自行更新。

答案 2 :(得分:0)

我不知道Python是如何工作的,但如果它是PHP,这将很容易(如果你知道你应该做什么)。

假设我的应用程序是myapp.py,它从第1步到第N步。我会让它返回(简单文本),一个数字。这个数字是它的'步数。例如,如果我调用http://localhost/myapp.py,它将返回5. 30分钟后,我重新加载页面,它返回15。

现在来看JavaScript的事情。我会建议使用jQuery。它使事情变得更容易,更快捷。我所要做的只是

$('#streaming').load('http://localhost/myapp.py');

这会将页面内容加载到ID = streaming的DIV。但只有在加载页面时才会发生这种情况。要使其每x秒发生一次,请使用JavaScript settimeout函数。

var t=setTimeout("javascript statement",milliseconds);

最好将加载步骤的部分存储在函数中,并在页面加载时使用setTimeout调用它。一旦脚本停止工作(使用特殊数字/消息),它也有助于停止setTimeout。

答案 3 :(得分:0)

使用纯JavaScript,您可以选择Comet,WebSockets和Ajax。然而,我对这些中的任何一个都不太了解。看看其中一些网站:

http://en.wikipedia.org/wiki/Comet_(programming)

http://www.websockets.org/

据我所知,Comet只涉及向Web服务器发出长期的Ajax请求,脚本可以根据需要推送数据。 WebSockets仅在某些浏览器的最新版本中受支持。最简单的解决方案是Omar Abid所建议的:通过Ajax每隔一段时间轮询一次Web服务器。

答案 4 :(得分:0)

您可以向应用程序添加一个服务器实例,该实例响应给定端口上的查询以及您的应用程序决定共享的内容。在可以访问应用程序状态信息的单独线程中启用此功能,然后让您的网页或监控程序向该端口发送请求。当然,您可以通过不同方式响应不同的请求。您需要的所有信息都在https://pymotw.com/3/socket/tcp.html上,但以下代码可以帮助您入门:

# borrowed from https://pymotw.com/3/socket/tcp.html
import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Bind the socket to the port
# (the host name used will need to be pingable from the requesting service)
server_address = ('', 10000)
print('starting up on {} port {}'.format(*server_address))
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

while True:  # add a terminator based on your application state
    # Wait for a connection
    print('waiting for a connection')
    connection, client_address = sock.accept()
    try:
        print('connection from', client_address)

        # Receive the data in small chunks and retransmit it
        while True:
            data = connection.recv(16)
            # print('received {!r}'.format(data))
            if data:  # add a check to ensure the request is valid
                print('sending data back to the client')
                data = 'Current application state is:' + getStatus()
                connection.sendall(data.encode())
            else:
                print('no data from', client_address)
                break
    finally:
        # Clean up the connection
        connection.close()