交互式python守护进程

时间:2018-03-20 14:11:54

标签: python python-3.x

有没有办法运行可以以交互方式处理输入的python?没有用户输入。这样,方法可以被称为,无需导入并初始化脚本。

我有什么:

import very_heavy_package
very_heavy_package.initialize()

if very_heavy_package.check(input_file):
    do_something()
else:
    do_something_else()

我想要类似的东西:

import very_heavy_package
very_heavy_package.initialize()

@entry_point()
def check_something(input_file):
    if very_heavy_package.check(input_file):
        do_something()
    else:
        do_something_else()

importinitialize()行需要很长时间,但check_something()几乎是即时的。我希望能够按需check_something()多次,而无需全部执行完整的脚本。

我知道这可以用内置的服务器实现,但似乎有点矫枉过正。是否有更多"本地"这样做的方式?

这个例子特别是关于在Raspberry Pi Zero上的监控摄像头的图像中运行一些 Google Vision 处理。初始化脚本需要一些时间(~10秒),但是使API请求非常快(<100ms)。我希望实现快速响应时间。

3 个答案:

答案 0 :(得分:0)

我不认为网络服务器有点矫枉过正。通过使用带有REST api的HTTP服务器,您使用的标准大多数人都会发现易于理解,使用和扩展。作为一个额外的优势,如果您想要自动使用您的工具,大多数自动化工具已经知道如何说REST和JSON。

因此,我建议您按照最初的想法使用http.server或诸如flask之类的库来创建一个带有REST api的小型,简洁的Web服务器。

答案 1 :(得分:0)

尝试python -im your_module

&#39;我&#39;旗帜是用于互动的,而且是用于互动的。 flag是for module。然后离开&#39; .py&#39;。

答案 2 :(得分:0)

我设法用信号解决了我的心血来潮。由于我不需要传递任何信息,只需触发一个功能,该功能可以解决我的需求。所以使用信号 python库和SIGUSR1

import signal
import time

import very_heavy_package
very_heavy_package.initialize()

def check_something():
    input_file = get_file()
    if very_heavy_package.check(input_file):
        do_something()
    else:
        do_something_else()

signal.signal(signal.SIGUSR1, check_something)

while True:
    # Waits for SIGUSR1
    time.sleep(600)

现在我可以使用

从bash启动守护进程
nohup python myscript.py &

并使用kill

拨打电话
pkill -SIGUSR1 -f myscript.py

<强>声明pkill命令有点危险,它可能会产生不良影响(即杀死打开了myscript.py的文本编辑器)。我应该研究杀死进程的更好方法。