2011-06-22 48 views
1

我想在這裏做兩件事情,動態地導入目錄中的所有模塊(數量/名稱未知),然後對於找到的每個模塊調用一個名爲checkMe的函數)。 checkMe()保證在每個模塊中,所以不需要檢查。這是我到目前爲止有:從模塊的動態列表中調用方法

進口

import sys 
import os 
import glob 

pathname = os.path.dirname(sys.argv[0]) + "/" 
pathname = pathname + "/modules/" 

__modules__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(pathname)+"/*.py")] 

for module in __modules__: 
    __import__(module) 

調用checkMe()

for module in __modules__: 
    m = getattr(sys.modules[__name__], module) 
    getattr(m, 'checkMe').__call__() 

但我得到這個錯誤:

AttributeError: 'module' object has no attribute 'sendme' 

(sendme是第一個模塊)

任何幫助非常感謝...謝謝!

+0

添加一些打印語句,以顯示你得到什麼'pathname','__modules__',等 –

+0

我很確定導入工作...我已經調試了,我沒有得到這些線路的錯誤了。 – pdeuchler

+0

如果可能仍然有助於查看'__module__'中的結果。每當你分配給一個變量時,我都會添加打印語句,這樣你就可以跟蹤整個應用程序的狀態並找出出錯的地方。 –

回答

0

__import__有一些關於軟件包(包含__init__.py的目錄)與模塊有關的棘手語義。您需要使用fromlist參數才能使其工作。正因爲如此,通過路徑運行的模塊是最容易runpy(從評論:run_path需要Python 2.7或更新版本):

import runpy 
runpy.run_path('path/to/file.py') 
+0

就像我上面所說的那樣,我非常肯定導入工作正常,這是在這些模塊中調用方法,我遇到了實際麻煩 – pdeuchler

+0

@pdeuchler不,導入沒有返回您期望的模塊。 'help(__ import __)'應該說服你。 – Tobu

+0

@Tobu:「當從包中導入模塊時,請注意'__import __('A.B',...)'在fromlist爲空時返回程序包A,而fromlist時它的子模塊B不爲空。那? – JAB