2010-01-21 213 views
8

我正在編寫一個Python程序,如果用戶在運行時更改設置,則需要重新啓動才能應用更改的設置。有沒有辦法做到這一點?重新啓動Python程序

import sys 
command_line = ' '.join(sys.argv) 
# Now do something with command_line 
# Now call my custom exit procedure 

注:我的線沿線的思考的東西,我在Windows上,如果有差別

+0

在UNIX上,後臺進程通常使用信號處理程序,在python中檢出信號模塊。你可以做相同的Windows – Anycorn

+0

相關:[是否可以在腳本中設置python -O(優化)標誌?](http://stackoverflow.com/q/7527055/4279) – jfs

回答

8

我會繞過所有你可能從試圖重新獲得焦慮 - 自己跑,把它交給環境。

通過這一點,我的意思是:

  1. 有一個控制程序,它什麼都不做超過運行程序(它被賦予了相同的參數)在一個循環中,而你的程序與特定「重啓退出「代碼。這可能與cmd文件一樣簡單,或者與使用os.system的另一個(非常簡單)Python程序一樣複雜。基本上,只要控制程序獲得代碼「重新啓動」,它將使用完全相同的參數重新運行程序。任何其他代碼將導致它退出該代碼。

  2. 當您想要完全退出時,讓您的真實Python程序退出並返回代碼0(或任何在錯誤情況下不是「重新啓動」的代碼)。

  3. 如果你只是想循環到你的程序的另一個迭代(例如重新讀取配置),退出與控制程序識別的「重新啓動」代碼。

但是,您可能還想考慮重新設計您的應用程序,以便它可以隨時重新讀取其配置。這將使整個問題消失。你沒有提到爲什麼這不是一個選項,所以我假設你有一些原因,爲什麼它不會工作。

但是,如果你不這樣做,那就是我選擇的路徑。

爲第一選項提供了一些示例代碼(這是在Windows,但在Cygwin下 - 同樣的基本規則應適用於Windows原生的Python,但你應該從os.system檢查返回值):

> cat phase1.py 
#!/usr/bin/python 
import os 
status = 9 
while status == 9: 
    status = int(os.system ("./phase2.py")/256) # exit code is upper 8 bits 
    print "Controller: %d"%(status) 

 

> cat phase2.py 
#!/usr/bin/python 
import sys 
import time 
time.sleep(1) 
val = int(time.time())%10 
if val == 0: 
    rc = 0 
else: 
    rc = 9 
print "Program: %d -> %d"%(val,rc) 
sys.exit(rc) 

 

> ./phase1.py 
Program: 2 -> 9 
Controller: 9 
Program: 3 -> 9 
Controller: 9 
Program: 4 -> 9 
Controller: 9 
Program: 5 -> 9 
Controller: 9 
Program: 7 -> 9 
Controller: 9 
Program: 8 -> 9 
Controller: 9 
Program: 9 -> 9 
Controller: 9 
Program: 0 -> 0 
Controller: 0 

您可以看到控制器使用9的退出碼來決定是否重新運行程序。該程序本身是一個愚蠢的程序,它會返回9,除非它是10秒的倍數。

5

在unix系統中,你可以使用os.execl家庭的功能:

這些功能全部執行新的程序,替換當前進程;他們不回來。在Unix上,新的可執行文件被加載到當前進程中,並且具有與調用者相同的進程ID。錯誤將被報告爲OSError異常。

在窗口上,看看os.spawnl系列,它比unix調用效率低。

+0

'os.execl ()'也適用於Windows。 – jfs