Python—将参数传递给已经运行的进程

Python—将参数传递给已经运行的进程,python,Python,首先,我对Python还很陌生。我还寻找了一个解决方案,但我想通常的方法(subprocess.popen)在我的案例中不起作用 我必须在已经运行的python脚本中向侦听器传递参数,而无需反复启动脚本。下面是一个如何将消息传递到lcd屏幕的示例: function printMsgText(message_text) local f = io.popen("home/test/show_message.py '" .. message_text .. "'") end 上面的lua脚本定义了

首先,我对Python还很陌生。我还寻找了一个解决方案,但我想通常的方法(subprocess.popen)在我的案例中不起作用

我必须在已经运行的python脚本中向侦听器传递参数,而无需反复启动脚本。下面是一个如何将消息传递到lcd屏幕的示例:

function printMsgText(message_text)
local f = io.popen("home/test/show_message.py '" .. message_text .. "'")
end
上面的lua脚本定义了每次接收消息时调用的进程。被调用的进程(show_message.py)如下所示:

import sys
from sense_hat import SenseHat
sense = SenseHat()
sense.clear()
sense.show_message(sys.argv[1])
我需要类似的东西,除了有另一个脚本在后台运行,所以show_message.py不是最后一个进程,而是需要将参数/消息传递给另一个已经运行的脚本。我的想法是让show_message.py将消息打印到控制台,并在主进程中使用sys.argv,但我有点担心它会变得混乱

有什么简单的方法可以做到这一点吗? 问候

编辑:

主脚本是控制步进电机。根据用户输入,电机驱动预定义的步数。等待用户输入的脚本部分如下所示:

while wait:
            user_position = input("Where do you wanna go? (0, 1, 2, back): ")
            wait = False
            #  Console output
            print("Position: " + str(user_position))

            if user_position == "0":
                stepper.set_target_position(position_zero)
                wait = True
            elif user_position == "1":
                stepper.set_target_position(position_one
                wait = True
            elif user_position == "2":
                stepper.set_target_position(position_two)
                wait = True
            elif user_position == "back":
                break

现在,我需要通过一个web应用程序来传递所需的位置,该应用程序是按照上述方式设计的(例如,每次传递变量/参数时调用lua脚本),而不是通过控制台

您可以使用某种消息传递库,允许您在进程之间进行通信。是一个很好的选择,并且有python绑定。

一旦进程运行,它将不会重新计算其命令行参数。你需要其他的方式与它沟通。这通俗地称为进程间通信(IPC),有几种实现方法。以下是一些:

  • 档案
  • 管道(在支撑管道的平台上)
  • 共享内存
  • 套接字通信
  • 消息传递
  • RPC
可能最接近的方法是标准流(STDIN,STDOUT),如您提到的
subprocess.popen()
所提供的。但这需要在通信过程之间建立父子关系。也许你可以走这条路


Python的另一种方法是,如果您想避免父子关系,我在这方面有很好的经验。它很容易使用,工作也很好,尽管有一些性能上的损失。这也是一种非常“基础架构式”的方式,两个流程都必须进行编码才能使用它。

非常感谢。据我所知,父子关系会给我带来一些问题,因为每次我发送消息时,父流程都会一次又一次地启动,孩子也会如此,对吗?@TheCakeWasALie如果我没有弄错你的描述,那么如果你的web应用程序在小时候启动后台进程,然后将传入的消息传递给它,那么它就可以工作。我想,至少有人告诉我,我无法在web应用程序和我的主脚本之间保持连接。我只能向通过专有协议连接的设备发送命令。在我的设备(RPi)上,我可以定义一个脚本,该脚本在收到命令后立即启动。当我发送另一个命令时,脚本将再次启动。所以每次我改变位置,我的脚本的一个新实例就会开始。所以我需要我的主脚本在后台运行,控制步进器和某种“控制”脚本,只传递一个数字/字符串,然后退出。@Cakewasalie然后你需要一些IPC。您可以独立启动主脚本(例如,当设备启动时)。然后,控制脚本的每个实例都连接到主脚本并转发它接收到的数据。对于通信,请使用最适合您的方式,例如Pyro,或者简单地让主脚本打开它侦听的套接字,然后控制器脚本打开该套接字进行写入。请添加有关管道的更多信息。我有一个正在运行的Python脚本,我想要另一个运行一些请求的Python脚本。在这种情况下如何实现管道?