2016-10-16 54 views
0

スクリプト(Python 3)用のウォッチドッグタイマーを作成しました。これにより、何かがうまくいかなかった場合(以下のコードでは表示されません)、実行を停止できます。しかし、私はPython(外部スクリプトなし)だけを使ってスクリプトを自動的に再起動することができます。コードはクロスプラットフォームと互換性がある必要があります。Pythonスクリプトの自己再起動

私はサブプロセスとexecv(os.execv(sys.executable, ['python'] + sys.argv))を試しましたが、Windowsでは非常に奇妙な機能があります。私はコマンドラインを開き、スクリプト( "python myscript.py")を実行します。スクリプトは停止しますが、終了しません(タスクマネージャによって確認されます)。Enterを2回押しない限り、スクリプト自体は再起動しません。私はそれが自動的に動作するようにしたいと思います。

提案がありますか?ご協力いただきありがとうございます!あなたは、単にはCtrl +Cを押したときに、あなたがあなたの元のスクリプトを破ることができない理由を説明し、あなたの元のスクリプトにスレッドを使用しているよう

import threading 
import time 
import subprocess 
import os 
import sys 

if __name__ == '__main__': 
    print("Starting thread list: " + str(threading.enumerate())) 

    for _ in range(3): 
     time.sleep(1) 
     print("Sleeping") 

    ''' Attempt 1 with subprocess.Popen ''' 
    # child = subprocess.Popen(['python',__file__], shell=True) 

    ''' Attempt 2 with os.execv ''' 
    args = sys.argv[:] 
    args.insert(0, sys.executable) 
    if sys.platform == 'win32': 
     args = ['"%s"' % arg for arg in args] 
    os.execv(sys.executable, args) 

    sys.exit() 

答えて

0

が鳴ります。この後

from time import sleep 
def interrupt_this() 
    try: 
     while True: 
      sleep(0.02) 
    except KeyboardInterrupt as ex: 
     # handle all exit procedures and data cleaning 
     print("[*] Handling all exit procedures...") 

、あなたは自動的に任意の外部せずに、でも、スクリプト自体の中から(自分の関連手続きを再開することができるはずです。その場合、あなたはこのように、スクリプトにKeyboardInterrupt例外を追加したい場合がありますスクリプト)。とにかく、関連するスクリプトを見ずに知るのは少し難しいので、もしあなたがそのスクリプトを分かち合うと、もっと助けてくれるかもしれません。

+0

ありがとうございました!私が持っている問題は、表示されていないスクリプトではなく、ポストされたコードである。それは、私がWindowsでそれを実行するためにスクリプトのクロックを倍増するとうまくいくことが判明しますが、コマンドラインから "python myscript.py"と入力すると機能しません。 Linuxでは現在の問題はありません。 – NJC

関連する問題