我在树莓派上运行了一个脚本,这些脚本是从php页面上的命令启动的。我有很多话要讲,现在我想在不停止脚本的情况下将新参数传递给脚本。通过将参数传递给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();
[注意,我使用快速的Google搜索找到了以上示例(出于教育目的对其进行了略微修改),但是这些示例未经测试,纯粹是为了帮助您入门。有关更多信息,请访问ZeroMQ和php-zmq
玩得开心。