如何在子 运行 完成之前终止 Python 程序?

How to Terminate a Python program before its child is finished running?

我有一个脚本应该 运行 24/7 除非被打断。这个脚本是脚本A。 我希望脚本 A 调用脚本 B,并在 B 处于 运行ning 时让脚本 A 退出。这可能吗? 这就是我认为可行的方法

#script_A.py
while(1)
    do some stuff
    do even more stuff
    if true:
        os.system("python script_B.py")
        sys.exit(0)


#script_B.py
time.sleep(some_time)
do something
os.system("python script_A.py")
sys.exit(0)

但似乎 A 直到 B 完成执行后才真正退出(这不是我想要发生的)。 还有其他方法吗?

您似乎想将系统调用分离到另一个线程。

script_A.py

import subprocess
import sys

while(1)
    do some stuff
    do even more stuff
    if true:
        pid = subprocess.Popen([sys.executable, "python script_B.py"]) # call subprocess
        sys.exit(0)

无论如何,这似乎根本不是一个好习惯。您为什么不尝试脚本 A 侦听进程堆栈,如果它找到脚本 B 运行 则停止。这是另一个示例。

import subprocess
import sys
import psutil

while(1)
    #This sections queries the current processes running
    for proc in psutil.process_iter():
        pinfo = proc.as_dict(attrs=['pid', 'name'])
        if pinfo[ 'name' ] == "script_B.py":
            sys.exit(0)
   
    do some stuff
    do even more stuff
    if true:
        pid = subprocess.Popen([sys.executable, "python script_B.py"]) # call subprocess
        sys.exit(0)

您所描述的听起来很像函数调用:

def doScriptB():
  # do some stuff
  # do some more stuff

def doScriptA():
  while True:
    # do some stuff
    if Your Condition:
      doScriptB()
      return

while True:
  doScriptA()

如果这对您来说还不够,那么您必须将进程与 python 进程分离。这通常涉及在后台生成进程,这是通过在 bash:

中的命令中附加一个符号来完成的
yes 'This is a background process' &

并从当前 shell 中分离所述进程,这在一个简单的 C 程序中是通过分叉进程两次来完成的。我不知道如何在 python 中执行此操作,但我敢打赌,有一个模块可以做到这一点。

这样,当调用 python 进程退出时,它不会终止生成的子进程,因为它现在是独立的。