2013-02-14 65 views
0

我是奧斯汀一家小型創業公司的數據人員。我所做的所有分析(迄今爲止)都存儲爲一組從我的筆記本電腦運行的特別腳本。這是一個壞主意。將Python分析腳本部署到服務器

我要在這裏畫出我的計劃來部署我的分析,我想知道是否有任何我曾經錯過的明顯漏洞,或者我應該考慮的其他事情。我認爲概要我保持足夠的原子,以便能夠在需要的時間和地點插入事物,而且還允許我輕鬆地運行一個腳本。次要(長期)目標是將簡單的Web前端向上放置,以允許用戶(即我公司的員工)一次調用一個腳本,請參閱:Very simple web service: take inputs, email results

我想將腳本部署到服務器,我正在考慮將我的腳本組織到一組python模塊中。然後,我希望我的批處理腳本如下所示:

import analysis 

batch_dict = analysis.build_batch_dict() 
assert sorted(batch_dict.keys()) = ['Hourly', 'Monthly', 'Nightly', 'Weekly'] 

scripts_to_run = analysis.what_batch() # get from command line? 
results_directory = analysis.make_results_directory() 
failures = {} 
for script in scripts_to_run: 
    try: 
     script.analyze() 
     script.export_results(results_directory) 
    except Exception as e: 
     failures.update(script.failed(e)) 

analysis.completed(failures) 

我將重寫我的分析以便它們由類處理。

class AnalysisHandler(object): 
    ... 
    def analyze(): 
     pass 
    def export_results(some_directory): 
     pass 
    def failed(exception): 
     pass 
    def run_with_non_default_args(*args, **kwargs): 
     pass 
    def something_else_im_missing_now(): 
     pass 

所有的腳本都會被繼承自AnalysisHandler的東西處理。

服務器上的目錄結構如下所示:

datalytics/ 
    results/ 
     02-14-2013/ 
      script1/ 
       /log 
       /error 
       /data 
      script2/ 
       /log 
       /error 
       /data 
      . 
      . 
      . 
      <etc> 
    scripts/ 
     script1/ 
      bin/ 
      data/ 
      doc/ 
      script_1/ 
      tests/ 
      setup.py 
     . 
     . 
     . 
    analysis/ 
     __init__.py 
     analysis.py 
    batch.py (see above) 
    new_script.py 
    run_all_tests.py 
    run_some_tests.py 
    run_this_script.py 
    run_everything.py 
+0

某處有在這裏一個問題...... – 2013-02-14 17:10:39

+0

「我要在這裏寫生我的計劃部署我的分析,我想知道,如果有,我已經錯過任何明顯的缺陷或者我應該考慮的其他事情。「我需要問號嗎? – BenDundee 2013-02-14 17:12:16

+1

時髦的權限問題可能會在創建目錄時引發異常。從測試背景來看,我認爲你最好將你的for循環封裝在'with open(output)'等文件中,然後寫出結果,並存儲它們。在服務器崩潰的情況下,你至少想知道運行的是什麼,以及是否有可能你的腳本卡在無限的東西中,並啃掉所有內存等。 – pyInTheSky 2013-02-14 17:23:42

回答

1

作爲一個正式的答案:

  • 當心,並嘗試捕獲異常創建文件時(你可能會得到權限問題),特別是當你添加一個前端,並希望寫在一個員工不能修改的目錄

  • 隨着你目前的設置,我建議將這個循環包裝在'with'語句中,保留一個打開的文件句柄,並在結果進入時刷新結果。這可以讓你在一定程度上跟蹤進度,還可以讓你知道你的服務器是否崩潰,測試是否運行,並可能如果其中之一導致崩潰

  • 你似乎正在開發相當多的框架。雖然unittest模塊是爲了測試Python代碼,但它當然可以用來代替很多框架(即排序測試,指定要運行哪些測試,日誌記錄等)。它還將爲您提供簡單的方法來附加界面,然後爲預期的故障等標記測試。

  • 與輸出一樣重要的是,讓它變得有用也很重要。你可能希望它以乾淨的文本打印,但是如果它開頭是一個python字典,並且你壓扁了它,請在你的日誌文件中添加一個逗號,然後將該字典轉儲爲一個字符串,這樣你就可以將該東西舀回到python中並根據需要操作數據。

  • 最後一點,看看json.dumps和json.loads,尤其是對於工作瓦特/日誌和Web UI。 javascript是友好的W /格式,你可以通過保持一切'蟒蛇快樂'格式保存自己的一大堆工作

  • 如果你需要它的話,測試的線程化並不難。如果你知道你有一項任務需要很長時間才能運行,或者是IO密集型的,那麼可以讓它獨立運行。如果你確實認爲你要走這條路線,從一開始就計劃它,並且知道你可能需要保護的變量,或者將所有結果推送到隊列中而不是字典上來解決競爭條件問題

  • 注意時間戳的分辨率,特別是如果你加載一個使用時間戳作爲一個關鍵的字典O_O --->乾脆不要做它

  • 我注意到config功能,它接受參數和kwargs。如果你打算允許配置測試,無論是通過UI或文件,特別是如果它是一個文件,使用json友好的格式,你可以做kwargs = json.loads(open(configfile,'r')。read())和非常高興你不必編寫解析器或正則表達式,或者在添加參數時修改代碼。

+0

分[-1]:好的。我也喜歡將腳本輸入爲json的想法。關於框架的數量---我認爲這是相對較小的開銷。儘管使用unittest是個不錯的主意。 – BenDundee 2013-02-14 18:27:39

+0

事實上,這並不多,但是我發現,測試發現它總是從小而來,然後迅速增長。如果您正在編寫新的測試代碼,則可以將其保留在同一個目錄中,並將其標記爲忽略。我已經完成了兩個。我對自制軟件框架非常滿意,特別是在unittest在python 2.7版本中增加了很多功能之前做了它,但是現在查看模塊,我發現使用「已知」框架的好處,特別是如果有人除了以後你將不得不使用它。 – pyInTheSky 2013-02-14 18:51:30