0

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

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

助言がありますか?ご協力いただきありがとうございます!

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()
4

1 に答える 1

0

Ctrl元のスクリプトでスレッドを使用しているように聞こえます。これは、 +を押すだけで元のスクリプトを壊すことができない理由を説明していますC。その場合、次のように、スクリプトに KeyboardInterrupt 例外を追加することをお勧めします。

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...")

この後、関連する手順を自動的に再開できるはずです (スクリプト自体からでも、外部スクリプトなしで)。とにかく、関連するスクリプトを見ないと知るのは少し難しいので、その一部を共有していただけると助かります。

于 2016-10-16T16:02:05.163 に答える