繁体   English   中英

将参数传递给正在运行的 python 脚本

[英]Passing arguments to a running python script

我有一个在我的树莓派上运行的脚本,这些脚本是从 php 页面的命令启动的。 我有多个 if 语句,现在我想在不停止脚本的情况下将新参数传递给脚本。 我通过将参数传递给 python 脚本找到了很多信息,但如果可能的话,当 svpcript 已经在运行以传递新参数时,我发现了很多信息。 提前致谢!

对我来说最好的选择是为您的脚本使用配置文件输入。 一些简单的 yaml 就可以了。 然后在一个单独的线程中,您必须观察文件的哈希值,如果它被更改,则意味着有人更新了您的文件,您必须重新/调整您的输入。

基本上,您一直在运行那个恒定的观察者。

您确实需要某种 IPC 机制。 当您从 PHP 应用程序执行/更新脚本时,我建议您研究一下 ZeroMQ 之类的东西,它支持 Python 和 PHP,并允许您执行快速而肮脏的Pub/Sub实现。

基本思想是,将您的 python 脚本视为来自 PHP 应用程序的消息的订阅者,该应用程序在需要时发布它们。 为了实现这一点,您需要启动一次您的python“脚本”并让它在后台运行,监听ZeroMQ上的消息。 像这样的事情应该让你走

import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    #  Wait for next message from from your PHP application
    message = socket.recv()
    print("Recieved a message: %s" % message)

    #  Here you should do the work you need to do in your script

    #  Once you are done, tell the PHP application you are done
    socket.send(b"Done and dusted")

然后,在您的 PHP 应用程序中,您可以使用以下内容向您的 Python 服务发送消息

$context = new ZMQContext();

//  Socket to talk to server

$requester = new ZMQSocket($context, ZMQ::SOCKET_REQ);
$requester->connect("tcp://localhost:5555");

$requester->send("ALL THE PARAMS TO SEND YOU YOUR PYTHON SCRIPT");
$reply = $requester->recv();

请注意,我使用快速谷歌搜索找到了上述示例(并出于教育目的稍作修改),但它们未经测试,纯粹是为了让您入门。 有关更多信息,请访问ZeroMQphp-zmq

玩得开心。

暂无
暂无

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

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