我有一个 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
模块中的函数即可。但存在三个复杂性。
首先,您想要运行另一个 Python 脚本,而不是二进制文件。假设您希望使用与运行时相同版本的 Python 来运行它,即使安装了多个 Python。因此,您想使用 sys.executable 作为程序。例如:
subprocess.check_call([sys.executable, 'otherscript.py'])
其次,您想要传递一些数据。对于适合命令行的少量可打印字符串数据,只需将它们作为参数传递即可:
subprocess.check_call([sys.executable, 'otherscript.py', detectedimsi])
然后,在另一个脚本中,您只需查看 sys.argv[1]
即可接收数据。
如果您尝试传递二进制数据或大量文本,您将需要通过管道传递它。最简单的方法是通过 stdin 传递它。但我认为这与此无关。
第三,您尝试在异步网络客户端或服务器内执行此操作。因此,您不能只运行另一个脚本并阻塞直到它完成,除非您完全确定它会很快完成。如果您的服务器框架有一种方法可以将子进程
集成到其中(Twisted 是我使用过的唯一一个可以做到这一点的框架,但可能还有其他框架),那就太好了。如果您可以将进程的标准输出管道放入框架的事件循环中,则可以伪造它(基本上,如果您不关心Windows,并且您的框架有办法将文件添加到 react 器)。但否则,您将不得不使用线程。
我假设您不需要从其他脚本获取任何结果,甚至不需要知道它何时完成。如果事实并非如此,事情就会变得更加复杂。
把它们放在一起:
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()
关于python - 将变量从一个 Python 脚本发送到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16788331/