我一直在互联网上寻找解决方案,虽然有类似的线程,但它们似乎有点过时或适用于 *nix 系统。这是我的情况:
我有一个正在运行的 Python 3.9 进程,它会执行一系列检查,并在检查结束时向我发送一封有关它们的电子邮件。有时此电子邮件进程会失败,我不想在继续之前等待并继续重试发送电子邮件,而是想将其传递给一个完全独立的进程,即使父/主进程提前终止,该进程也将继续尝试发送电子邮件。
这是我一直在尝试的一些模拟代码: 主流程.py
import subprocess
import time
#doing checks and what not
#email fails to send at first
p1 = subprocess.Popen(['python','path/to/test_email_send.py', 'test1', 'test2'], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP|subprocess.DETACHED_PROCESS, start_new_session=True)
time.sleep(5)
#continue doing some other stuff but ultimately finishing before the email retry can finish
我已经尝试过这个以及上述代码的多种变体(使用守护进程进行多重处理、不同的创建标志、执行一个 .bat 文件,该文件对 test_email_send.py 进行 pythonw 操作)。每次,上述子进程启动,但当它超过 time.sleep(5) 并且父/主脚本完成/终止时,子进程就会终止。我不需要在父脚本末尾检查子进程,我只是希望它与父脚本分离并继续在后台重试发送电子邮件(例如 30 分钟或直到成功)。
请帮忙
我环顾四周,发现了以下解决方案。我不知道这是否是好的做法,或者是否适合您的需求。
对于 main.py 我有:
import shlex
import subprocess
import time
cmd = "python test.py"
cmds = shlex.split(cmd)
p = subprocess.Popen(cmds, start_new_session=True)
time.sleep(5)
print("finished main.py")
对于 test.py:
import time
print("test.py started")
for _ in range(10):
time.sleep(1)
print("still working")
print("test.py finished")