2012-07-04 267 views
14

我有一個基於python的GTK應用程序加載了幾個模塊。它是從(Linux)的終端,像這樣運行:從本身重新啓動python腳本

./myscript.py --some-flag setting

從該程序的用戶可以下載(使用GIT)的較新版本中。 如果存在/被下載,出現一個按鈕,我希望用新編譯的內容(包括依賴/導入)重新啓動程序。最好它還會使用sys.argv的內容重新啓動它,以保持所有標誌原樣。

所以我找不到/需要的是一個很好的重啓過程,它會殺死程序的當前實例並使用相同的參數啓動一個新的程序。

該解決方案最好也適用於Windows和Mac,但它不是必需的。

+0

什麼可能是可能是有在第一併行運行舊的一個新的進程。理論上你可以給新進程一箇舊進程的ID(通過一個額外的命令行選項),並在新進程啓動並運行時立即終止。 –

+0

[重新啓動自我更新的Python腳本]的可能的重複(http://stackoverflow.com/questions/1750757/restarting-a-self-updating-python-script) –

回答

24

您正在查找os.exec*()

+0

哇!我不知道這是可能的。感謝您指出了這一點! –

+2

這給了我一個與Python 2.7.9無效的語法錯誤。 – clankill3r

2

更新 - 一些例如上面的回答備查

runme.sh

#!/bin/bash 
kill -9 server.py 
python /home/sun/workspace/c/src/server.py & 

,我有server.py,我需要重新啓動應用程序本身,所以我不得不:

os.system('runme.sh') 

但是沒有按照runme.sh重新啓動應用程序本身,所以當我用這種方式時:

os.execl('runme.sh', '') 

然後我就能將其自身重啓

14

我認爲這是一個更復雜的答案,因爲有時你可能最終與打開太多的文件對象和描述符,可能會導致內存問題或併發連接一個網絡設備。

import os 
import sys 
import psutil 
import logging 

def restart_program(): 
    """Restarts the current program, with file objects and descriptors 
     cleanup 
    """ 

    try: 
     p = psutil.Process(os.getpid()) 
     for handler in p.get_open_files() + p.connections(): 
      os.close(handler.fd) 
    except Exception, e: 
     logging.error(e) 

    python = sys.executable 
    os.execl(python, python, *sys.argv) 
0

我知道這個解決方案在技術上沒有你問什麼,但如果你想成爲100%肯定你釋放所有或不想依靠的依賴,你可以只從運行腳本環路另:

import os, time 

while 1: 
    os.system("python main.py") 
    print "Restarting..." 
    time.sleep(0.2) # 200ms to CTR+C twice 

然後你就可以重新啓動main.py簡單,如:

quit()