将变量从一个Python脚本发送到另一个

时间:2013-05-28 09:19:40

标签: python json variables

我有一个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

2 个答案:

答案 0 :(得分: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访问)并将路径作为第一个参数传递给脚本(以及之后的其余参数)。

答案 1 :(得分:1)

要运行任何其他程序,只需使用subprocess模块中的功能即可。但有三个复杂性。

首先,您要运行另一个Python脚本,而不是二进制文件。据推测,您希望使用与您运行的相同版本的Python运行它,即使安装了多个Pythons也是如此。因此,您希望使用sys.executable作为程序。例如:

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

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

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

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

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

第三,您尝试在异步网络客户端或服务器中执行此操作。所以,除非你完全确定它会以非常快的速度完成,否则你不能只运行另一个脚本并阻塞它。如果您的服务器框架有一种方法可以将subprocess es集成到其中(Twisted是我曾经使用过的唯一一个,但可能还有其他人),非常棒。如果你可以把进程的stdout管道扔进你的框架的事件循环中,你可以伪造它(基本上,如果你不关心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()