2017-04-05 150 views
2

我有一个脚本,应该24/7运行,除非中断。这个脚本是脚本A. 我希望脚本A调用脚本B,并且脚本A在B运行时退出。这可能吗? 这就是我想会的工作如何在子程序运行完之前终止Python程序?

#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) 

但它好像一个实际上不退出,直到B已经执行完毕(这不是我希望发生的)。 有没有另一种方法来做到这一点?

+0

尝试使用'os.system(“python script_B.py&”)'在后台启动您的B脚本。 – Alfe

+0

os.system是同步的。 – Marichyasana

回答

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' & 

和拆卸所述从当前的外壳,其中在简单的C程序由分叉完成过程该过程两次。我不知道如何在Python中做到这一点,但会打赌,有一个模块。

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

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监听Process Stack,如果它发现脚本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)