2017-04-05 413 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)