2016-10-16 254 views
0

我爲我的腳本(Python 3)創建了一個監視程序計時器,它允許我在出現任何問題時停止執行(未在下面的代碼中顯示)。不過,我希望能夠僅使用Python自動重新啓動腳本(無需外部腳本)。代碼需要跨平臺兼容。自我重新啓動Python腳本

我已經嘗試子流程和execv(os.execv(sys.executable, ['python'] + sys.argv)),但是我在Windows上看到非常奇怪的功能。我打開命令行並運行腳本(「python myscript.py」)。腳本停止但不會退出(通過任務管理器驗證),並且除非我按兩次輸入,否則它不會自行重新啓動。我希望它能自動工作。

有什麼建議嗎?謝謝你的幫助!

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

聽起來像是你在你的原劇本,這也解釋了爲什麼你不能打破你原來的腳本只需按下Ctrl鍵+ç使用線程。在這種情況下,你可能要一個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...") 

在這之後,你應該能夠甚至從腳本本身內自動重新啓動有關程序(,無需任何外部腳本)。無論如何,如果沒有看到相關的腳本,就很難知道,所以如果你分享一些腳本,也許我會有更多的幫助。

+0

感謝您的迴應!我遇到的問題不在於未顯示的腳本,而是在發佈的代碼中。事實證明,當我在Windows上運行腳本的時鐘倍增時,它工作正常,但是當我從命令行鍵入「python myscript.py」時,它不起作用。 Linux中沒有當前的問題。 – NJC