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

时间:2017-04-04 12:23:20

标签: python

首先,我是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])

我需要类似的东西,除了在backround中运行另一个脚本,因此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脚本)而不是通过控制台。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

  • 文件
  • 管道(在支持它们的平台上)
  • 共享内存
  • 插播通讯
  • 消息传递
  • RPC

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

Python的另一种方式,如果你想避免亲子关系,我已经获得了良好的经验是Pyro。它易于使用且运行良好,尽管有一些性能损失。它也是一个非常基础设施的基础设施。为此,两个过程都必须编码才能使用它。