执行独立的Python文件,即使父文件在Windows上终止后仍继续运行

问题描述 投票:0回答:1

我一直在互联网上寻找解决方案,虽然有类似的线程,但它们似乎有点过时或适用于 *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 分钟或直到成功)。

请帮忙

python python-3.x windows subprocess
1个回答
0
投票

我环顾四周,发现了以下解决方案。我不知道这是否是好的做法,或者是否适合您的需求。

对于 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")
© www.soinside.com 2019 - 2024. All rights reserved.