2013-03-04 19 views
1

我想檢查腳本導入的所有模塊是否在我實際運行腳本之前安裝,因爲腳本非常複雜,通常會運行數小時。此外,它可能會根據傳遞給它的選項導入不同的模塊,因此只運行一次可能無法檢查所有內容。所以,我不想在一個新的系統上運行這個腳本幾個小時,只是因爲缺少模塊而在完成之前發現它失敗。如何檢查是否安裝了所有由Python腳本導入的模塊而不運行腳本?

顯然,pyflakes和pychecker在這裏沒有幫助,請糾正我,如果我錯了。我可以做這樣的事情:

$ python -c "$(cat *.py|grep import|sed 's/^\s\+//g'|tr '\n' ';')" 

,但它不是很強大的,它會如果單詞「進口」出現在一個字符串,例如打破。

那麼,我該如何正確地完成這項任務?

+0

簡單的解決方案是將grep更改爲'grep'^ \ s * import'',因爲沒有Python行可能以import導入(如果我錯了,請糾正我)。 – FakeRainBrigand 2013-03-04 11:38:31

+0

http://stackoverflow.com/questions/2875232/list-python-package-dependencies-without-loading-them可能是相關的。特別是:http://furius.ca/snakefood/看起來像它做你想要的 – entropy 2013-03-04 11:39:58

+0

@FakeRainBrigand那麼'從進口'?不,任何基於正則表達式的解決方案都太脆弱了。最好的方法是在AST級別工作,而不是在我之前的評論中鏈接的sfoodfood的文本級別(或者至少聲稱,從未嘗試過) – entropy 2013-03-04 11:41:09

回答

6

你可以使用ModuleFinder從標準庫模塊搜尋器 使用docs的示例

from modulefinder import ModuleFinder 
finder = ModuleFinder() 
finder.run_script('bacon.py') 

print 'Loaded modules:' 
for name, mod in finder.modules.iteritems(): 
    print '%s: ' % name, 
    print ','.join(mod.globalnames.keys()[:3]) 

print '-'*50 
print 'Modules not imported:' 
print '\n'.join(finder.badmodules.iterkeys()) 
+0

太好了,非常感謝。這似乎正是我需要的。即使它是標準模塊,我也不知道「模塊搜索器」! – piokuc 2013-03-04 12:09:22

+0

雖然沒有運行腳本嗎?他明確表示他不想那樣做 – entropy 2013-03-04 12:19:31

+0

@entropy不是真的 - > gist.github.com/ephexeve/5081940 – 2013-03-04 12:30:25

1

你可以寫一個test.py,僅僅包含了所有例如可能進口:

import these 
import are 
import some 
import modules 

運行它,如果有任何問題,Python將讓你知道

+0

感謝您的回答。這是一個相當不錯的方法,唯一的問題是如果手動編輯此測試,則很容易忘記更新它。 – piokuc 2013-03-04 12:16:21

相關問題