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脚本每次传递一个变量/参数)而不是通过控制台。
答
一旦进程正在运行,它将不会重新评估其命令行参数。您需要其他方式与它沟通。这通常称为进程间通信(IPC),并且有几种方法来实现它。这里有几个:
- 文件
- 管(在支持它们的平台)
- 共享存储器
- 套接字通信
- 消息传递
- RPC
大概最平易近人的方式是标准流(STDIN,STDOUT),例如,您提到的subprocess.popen()
。但是这需要沟通过程之间的亲子关系。也许你可以走这条路。
Python的另一种方式,如果你想避免亲子关系,我已经取得了良好的经验是Pyro。这很容易使用和运行良好,虽然有一些性能损失。这也是一种非常“基础设施”的方式,两个流程都必须进行编码才能使用它。
非常感谢。根据我的理解,亲子关系会给我带来一些问题,因为每次我发送一条消息,父进程就会重复开始,孩子也会这样,对吧? –
@TheCakeWasALie如果我正确地获得了您的描述,它可以工作,如果您的Web应用程序作为孩子启动后台进程,然后将传入的消息传递给它。 – ThomasH
我想这里是没有办法,我可以保持Web应用程序和我的主要脚本之间的连接,至少我被告知。我只能将命令发送到通过专用协议连接的设备。在我的设备(一个RPi)上,我可以定义一个脚本,一接到命令就立即开始。当我发送另一个命令时,脚本再次启动。所以每当我改变位置时,我的脚本的一个新实例就会开始。所以我需要我的主脚本在后台运行,控制步进器和某种“控制”脚本,只是传递一个数字/字符串,然后退出。 –