【问题标题】:Python - Passing arguments to an already running processPython - 将参数传递给已经运行的进程
【发布时间】:2017-04-04 12:23:19
【问题描述】:

首先,我对 Python 还是很陌生。我也搜索了一个解决方案,但我想通常的方法(subprocess.popen)在我的情况下不起作用。

我必须在已经运行的 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 脚本)而不是通过控制台。

【问题讨论】:

    标签: python


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一旦进程运行,它就不会重新评估其命令行参数。您需要其他方式与之通信。这通俗地称为进程间通信 (IPC),有几种方法可以实现它。以下是一些:

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

      可能最平易近人的方式是标准流(STDIN、STDOUT),由例如提供。 subprocess.popen() 你提到的。但这需要通信进程之间的父子关系。也许你可以走这条路。

      如果你想避免父子关系,Python 的另一种方式是Pyro。它易于使用且运行良好,尽管有一些性能损失。这也是一种非常“基础设施”的方式,必须对两个进程进行编码才能使用它。

      【讨论】:

      • 非常感谢。据我了解,父子关系会给我带来一些问题,因为每次我发送消息时父进程都会一遍又一遍地启动,孩子也会如此,对吧?
      • @TheCakeWasALie 如果我的描述正确,如果您的 Web 应用程序作为子进程启动后台进程,然后将传入消息传递给它,它就可以工作。
      • 我认为我无法在网络应用程序和我的主脚本之间建立连接,至少有人告诉我。我只能向通过专有协议连接的设备发送命令。然后,在我的设备(RPi)上,我可以定义一个脚本,该脚本在收到命令后立即启动。当我发送另一个命令时,脚本再次启动。所以每次我改变位置时,我的脚本的一个新实例就会开始。所以我需要我的主脚本在后台运行,控制步进器和某种“控制”脚本,只需传递一个数字/字符串,然后退出。
      • @TheCakeWasALie 那么你需要一些 IPC。您可以独立启动主脚本(例如,当设备启动时)。然后控制脚本的每个实例都连接到主脚本并转发它接收到的数据。对于交流,请使用最适合您的方式,例如Pyro,或者简单地让主脚本打开它监听的套接字,然后控制器脚本打开该套接字进行写入。
      • 请您添加一些有关管道的更多信息。我有一个正在运行的 Python 脚本,我想要另一个运行一些请求的 Python 脚本。这种情况下如何实现管道?
      猜你喜欢
      • 2019-03-26
      • 2016-06-29
      • 1970-01-01
      • 2011-05-31
      • 2015-02-12
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多