从一个Python脚本向另一个脚本发送一个变量

2024-04-29 14:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: self服务器脚本jsonobj消息messageon
2条回答

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

首先,您需要运行另一个Python脚本,而不是二进制脚本。假设您希望使用运行它的同一版本的Python运行它,即使安装了多个Python。所以,您希望使用sys.executable作为程序。例如:

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

其次,需要传递一些数据。对于可以在命令行中使用的少量可打印字符串数据,只需将它们作为参数传递:

^{pr2}$

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

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

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

我假设你不需要从另一个脚本得到任何结果,甚至不需要知道什么时候完成。如果那不是真的,那就更复杂了。在

综合起来:

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()

您需要subprocess模块:

import subprocess

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

^{pr2}$

您的另一个进程将接收您要作为JSON格式的sys.argv[1]传递的值(因此它需要使用json.loads(sys.argv[1]))。在

传递值的其他方法也是可能的,但将其作为命令行参数传递可能就足够了(取决于数据的大小和其他因素)。在

正如阿巴内特指出的,有些事情应该提到:

  • 这种调用子进程的方式将阻塞,直到子进程完成。如果您的脚本在子进程完成之前应该再次处于被动状态,那么这可能是一个问题。在
  • 在不提供直接调用脚本的系统上,通过将其路径指定为可执行文件来调用子进程脚本可能会失败。在这些情况下,您必须调用解释器(可以作为sys.executable)来调用,并将脚本的路径作为第一个参数传递给脚本(以及之后的其他参数)。在

相关问题 更多 >