簡體   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