我试图在python中构建一个todo管理器,我想继续在bg中运行一个进程,该进程将在指定的时间到来时用弹出窗口提醒用户。我想知道如何实现这一目标。 我已经查看了StackOverflow和其他网站上的一些答案,但没有一个真正有用。 所以,我想要实现的是在用户输入任务后开始一个bg进程并继续在后台运行它,直到时机成熟。同时,可能还有其他线程正在运行以执行其他任务,这些线程将在其结束时间结束。
到目前为止,我已经尝试过这个:
t = Thread(target=bg_runner, kwargs={'task': task, 'lock_file': lock_file_path})
t.setName("Get Done " + task.
t.start()
t.join()
有了这个,线程就会继续运行,但它在前台运行,只在执行完毕后退出。
如果我在上面的代码中添加t.daemon = True
,主线程会在start()
之后立即退出,看起来守护程序也会被杀死。
请让我知道如何解决这个问题。
答案 0 :(得分:1)
您需要做的第一件事是通过在主线程中添加while
循环来阻止您的脚本退出:
import time
from threading import Thread
t = Thread(target=bg_runner, kwargs={'task': task, 'lock_file': lock_file_path})
t.setName("Get Done " + task)
t.start()
t.join()
while True:
time.sleep(1.0)
然后你需要把它放在后台:
$ nohup python alert_popup.py >> /dev/null 2>&1 &
您可以在此answer获取有关控制后台流程的更多信息。
答案 1 :(得分:0)
我猜你在启动脚本后不想看到终端窗口。在这种情况下,这是一个如何执行脚本的问题。
如果您使用的是Windows计算机,可以尝试使用pythonw.exe:
如果你使用的是linux(也许是OSx),你可能想要使用' nohup'在终端。
nohup python example_script.py
或多或少,您必须这样做的原因归结为操作系统如何处理进程。我不是这个主题的专家,但通常如果您从终端启动脚本,该脚本将成为终端的子进程。因此,如果退出该终端,它也将终止所有子进程。解决这个问题的唯一方法是使用类似nohup
的方法从终端分离进程。
现在,如果您最终添加了#!/usr/bin/env python
shebang行,那么只要双击脚本,您的操作系统就可以在没有终端窗口的情况下运行脚本。 YMMV(再次取决于您的操作系统的工作方式)