2013-03-24 76 views
3

我正在編寫一個簡單的設置嚮導像Python中的腳本。基本上它會提示用戶輸入一些數值並回答一些是/否的問題。基於用戶輸入,腳本將創建目錄,創建和初始化配置文件,創建符號鏈接,設置權限等。像Python中的腳本安裝嚮導

當用戶做出選擇時會採取不同的路徑,目錄結構和符號鏈接的存在可能會有所不同。在每個步驟中可能會出現許多問題,可能需要用戶更改輸入或回滾整個事件。

1 - 這是編寫此腳本的最佳方法嗎?這個文本菜單設置嚮導是一個好主意嗎?

2-是否有一個模塊,可以幫助使這個更簡單,使我不重新發明輪子?

3-我應該在用戶做出選擇時真正執行每一步嗎?或者等到結束並一次做所有事情?

4-什麼是最好的方式來記住已經創建的結構,以便我可以編寫一個回滾函數?

我不希望任何代碼作爲答案;任何建議,意見或外部鏈接表示讚賞。

回答

2

我不做GUI的東西。你可以寫一個,但是我們假設你完全在命令行上完成。

  1. 我會建議在做出物理副作用之前接受所有用戶輸入。換句話說,在用戶完成所有選項之前,不要開始創建目錄。 Python文檔工具Sphinx就是一個很好的例子。當用戶啓動quickstart時,它會向用戶詢問很多問題。獅身人面像直到最後纔會生成物理目錄和配置文件。這消除了「記住」是累人的需要。分支太多。不要這樣做。在最後完成整個設置。

  2. 取決於。如果你想製作一個簡單的命令行界面,Python有argpase來製作命令行選項。以上是使用建立在argparse之上的docopt庫實現的。但是如果你想要命令行,這是很有用的。如果你的腳本只需要調用「python script.py」,然後開始詢問用戶的問題,我不知道任何有用的庫來處理安裝的東西。

其實我是在開發一個名爲dcoprompt的中間,但還沒有完成。 https://bitbucket.org/yeukhon/docprompt基本上它應該允許你寫下你的設置提示,然後記住它們。代碼庫很糟糕,效率不高。你可以試試,但是我不會在夏天之前完成這個功能,因爲這個學期的作業量很大。

所以答案是否定的。你必須自己編寫代碼。只是很多原始投入和很多變數。

  1. 再次等待,直到結束才產生副作用。

  2. 再一次,等到最後做出副作用。


編輯

說你等到年底創建目錄和符號鏈接,並在步驟IO錯誤發生的一個,要撤消整個安裝。如果您正在創建的是目錄,文件和符號鏈接,請將它們添加到列表字典中。看我的編輯。

def physical_setup(...): 
    memory = { 
     'dirs': [], 
     'symlinks': [], 
     'files': [] 
    } 
    try: 
     # start doing physical setup 
     memory['dirs'].append('/tmp/dir1')   
     os.path.mkdir('/tmp/dir1') 

    # catching all exceptions is considered a bad practice but sometimes be a little badass 
    except Exception as e: 
     for key, valist in memory.iteritems(): 
      if key == 'dirs': 
       for dir in valist: 
        shutil.rmtree(dir) 

重要:上面的代碼中有一個問題,您應該取消鏈接,delting的文件夾之前刪除的文件,並顯示目錄。因爲如果這些文件是已經刪除的目錄的一部分,你將不得不默默地捕捉到這個異常。很多代碼。只需取消鏈接,刪除文件和目錄。

+0

+1這非常有幫助,有關回滾功能的任何建議? – jurgenreza 2013-03-24 18:01:31

+0

看我的編輯。取決於你要做什麼。只是目錄和文件和符號鏈接,這很簡單。 – CppLearner 2013-03-24 18:13:54

+0

不要忘記告訴用戶出了什麼問題。這是我們應該抓住一個特定錯誤的主要原因。 – CppLearner 2013-03-24 18:14:53