繁体   English   中英

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

[英]Send a Variable from one Python Script to another

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

您将需要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进行访问),并将路径传递到脚本作为第一个参数(以及之后的其余参数)。

要运行任何其他程序,只需使用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传递它。 但是我认为这无关紧要。

第三,您尝试在异步网络客户端或服务器中执行此操作。 因此,除非完全确定它将很快完成,否则您不能只运行另一个脚本并阻塞直到它完成。 如果您的服务器框架具有将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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM