2017-04-05 19 views
2

私は中断されない限り、24時間365日に実行されるはずのスクリプトを持っています。このスクリプトはスクリプトAです。 スクリプトAはスクリプトBを呼び出し、スクリプト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) 

を働くだろうと思ったものです。しかしAが実際に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プログラムに分岐することによって行われ、現在のシェルから前記プロセスを取り外しますこのプロセスは2回です。私は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はプロセススタックをリッスンし、スクリプト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) 
関連する問題