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

问题描述:

首先,我对Python很陌生。我也搜索了一个解决方案,但我想通常的做法(subprocess.popen)不会在我的情况下工作。Python - 将参数传递给已经运行的进程

我必须将参数传递给已经运行的python脚本中的监听器,而不必一次又一次地启动脚本。有一个例子如何传递消息到液晶屏:

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脚本每次传递一个变量/参数)而不是通过控制台。

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

一旦进程正在运行,它将不会重新评估其命令行参数。您需要其他方式与它沟通。这通常称为进程间通信(IPC),并且有几种方法来实现它。这里有几个:

  • 文件
  • 管(在支持它们的平台)
  • 共享存储器
  • 套接字通信
  • 消息传递
  • RPC

大概最平易近人的方式是标准流(STDIN,STDOUT),例如,您提到的subprocess.popen()。但是这需要沟通过程之间的亲子关系。也许你可以走这条路。

Python的另一种方式,如果你想避免亲子关系,我已经取得了良好的经验是Pyro。这很容易使用和运行良好,虽然有一些性能损失。这也是一种非常“基础设施”的方式,两个流程都必须进行编码才能使用它。

+0

非常感谢。根据我的理解,亲子关系会给我带来一些问题,因为每次我发送一条消息,父进程就会重复开始,孩子也会这样,对吧? –

+0

@TheCakeWasALie如果我正确地获得了您的描述,它可以工作,如果您的Web应用程序作为孩子启动后台进程,然后将传入的消息传递给它。 – ThomasH

+0

我想这里是没有办法,我可以保持Web应用程序和我的主要脚本之间的连接,至少我被告知。我只能将命令发送到通过专用协议连接的设备。在我的设备(一个RPi)上,我可以定义一个脚本,一接到命令就立即开始。当我发送另一个命令时,脚本再次启动。所以每当我改变位置时,我的脚本的一个新实例就会开始。所以我需要我的主脚本在后台运行,控制步进器和某种“控制”脚本,只是传递一个数字/字符串,然后退出。 –