如何在子程序运行完毕之前终止它?

时间:2017-04-05 21:41:18

标签: python python-3.x terminate os.system

我有一个脚本应该全天候运行,除非被打断。这个脚本是脚本A. 我希望脚本A调用脚本B,并在B运行时让脚本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完成执行之前并没有真正退出(这不是我想要发生的事情)。 还有另一种方法吗?

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分: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进程退出时,它不会终止生成的子进程,因为它现在是独立的。