1

我有一个 python 脚本,它不断地监听来自另一台服务器的 json 消息。当它收到一条消息时,其中一个值被放入一个变量中。收到此消息后,我需要启动另一个 python 脚本并处理过去的变量。谁能帮助我如何做到这一点?

我对 python 很陌生,非常感谢你能给我的任何帮助,因为我正在努力理解类似问题的其他一些答案。

谢谢!

下面是不断运行以接收消息的代码:

class MyListener(stomp.ConnectionListener):
    def on_error(self, headers, message):
        print 'received an error %s' % message

    def on_message(self, headers, message):
        print 'received a message %s' % message
        obj = json.loads(message)
        detectedimsi = obj["imsi"]
        print detectedimsi
4

2 回答 2

1

要运行任何其他程序,您只需使用subprocess模块中的函数。但存在三个复杂性。

首先,您要运行另一个 Python 脚本,而不是二进制文件。假设您想使用与您正在运行的相同版本的 Python 运行它,即使安装了多个 Python。所以,你想sys.executable用作程序。例如:

subprocess.check_call([sys.executable, 'otherscript.py'])

其次,你想传递一些数据。对于适合命令行的少量可打印字符串数据,只需将它们作为参数传递:

subprocess.check_call([sys.executable, 'otherscript.py', detectedimsi])

然后,在另一个脚本中,您只需查看sys.argv[1]接收数据。

如果您尝试传递二进制数据或大量文本,则需要通过管道传递它。最简单的方法是通过stdin. 但我认为这与这里无关。

第三,您尝试在异步网络客户端或服务器中执行此操作。因此,您不能只运行另一个脚本并阻止它直到它完成,除非您绝对确定它会很快完成。如果您的服务器框架有办法将subprocesses 集成到其中(Twisted 是我用过的唯一一个,但可能还有其他框架),那就太好了。如果您可以将进程的标准输出管道扔到框架的事件循环中,则可以伪造它(基本上,如果您不关心 Windows,并且您的框架有办法将文件添加到反应器)。但否则,您将不得不使用线程。

我假设您不需要从其他脚本获得任何结果,甚至不需要知道它何时完成。如果这不是真的,它会变得更复杂一些。

把它们放在一起:

def on_message(self, headers, message):
    print 'received a message %s' % message
    obj = json.loads(message)
    detectedimsi = obj["imsi"]
    print detectedimsi
    thread = threading.Thread(target=subprocess.call, 
                              args=[[sys.executable, 'otherscript.py', detectedimsi]])
    thread.daemon = True
    thread.start()
于 2013-05-28T09:37:28.330 回答
1

您将需要该subprocess模块:

import subprocess

然后在您的on_message()方法中,您可以启动另一个过程:

  def on_message(self, headers, message):
    …
    outputOfOtherProcess = subprocess.check_output([
      '/path/to/other/process',
      json.dumps(detectedimsi) ])

您的其他进程将以 JSON 格式接收您要传递的值sys.argv[1](因此需要使用json.loads(sys.argv[1]))。

传递值的其他方式是可能的,但将其作为命令行参数传递可能就足以满足您的情况(取决于数据的大小和其他因素)。

正如 abarnert 指出的,有些事情应该被提及:

  • 这种调用子进程的方式会一直阻塞,直到子进程完成。如果您的脚本应该在子进程完成之前再次响应,这可能是一个问题。
  • 在不提供直接调用脚本的系统上,通过将路径作为可执行文件来调用子进程脚本可能会失败。在这些情况下,您将不得不调用解释器(可以作为 访问sys.executable)并将路径作为第一个参数传递给脚本(以及之后的其余参数)。
于 2013-05-28T09:33:06.630 回答