2010-10-30 149 views
5

我正在編寫一個用於從科學儀器獲取數據的python小程序,並且試圖找出管理我的設備「驅動程序」的最佳方法。在python中延遲加載模塊

每個驅動程序都是我的程序包中的一個單獨的python模塊。它們每個都實現一些標準接口,但大多數是一個龐大的命令列表(和函數映射),它們是每個設備和總線所特有的。從長遠來看,(我正在爲我的實驗室小組編寫這個文件,並計劃支持幾十個設備),我想避免一次加載所有這些設備。相反,在運行時,我想將模塊列表讀入字典/列表中,然後僅在實際需要時加載它們。

當用戶想要使用新設備時,他選擇要使用的驅動程序,並將該名稱傳遞給驅動程序子系統,然後檢查驅動程序子系統是否在已加載模塊列表中,如果不是,它調用__import__函數並加載驅動程序,然後使用驅動程序實例化設備對象,並將其交給用戶使用。

我的問題是:以相對方式獲取所有模塊列表的最佳方式是什麼?我的意思是,如果我知道驅動程序位於..drivers中,是否有辦法在該子包中獲取整潔的模塊列表?舉例說明:通常我只需撥打from ..drivers import driver_name即可導入模塊,但由於我不能保證在的軟件包目錄中,不能只有我們os才能得到模塊名稱列表。在任何情況下,任何想法(甚至可能是一個更好的方式來完成我想要的 - 可加載的「驅動程序」),將不勝感激。

回答

3

如果驅動程序包的位置已知,則可以使用驅動程序文件夾的絕對路徑。

我認爲一個更強大的方法是爲您的程序列出所有已知的驅動程序,也許還有一些元數據,以便用戶可以更輕鬆地選擇它們。如果您知道可能的位置,您可以讓駕駛員自行註冊,或自行註冊。使驅動程序自行註冊的一個優點是,您可能在驅動程序包目錄中具有非驅動程序的python文件。

編輯

對於司機「註冊自己,」你可能會做這樣的事情:

if __name__ == "__main__": 
    import mamapackage 
    mamapackage.register("thisdriver", 
       os.path.abspath(__file__), 
       "A description of this driver") 

然後在你自己的包,提供一個更新列表中的「註冊」功能的司機,他們的位置和描述(一個簡單的文本文件應該爲初學者做)。

+0

我該如何去讓駕駛員註冊自己?用小腳本實現它們以查找我的軟件並註冊它們自己?或更聰明的東西? – crasic 2010-10-30 10:30:54

+0

感謝您的好建議,我實現了一個簡單的文本文件來保存驅動程序名稱和元數據,可能不是最好的長期解決方案(當人們可能想要導入外部驅動程序時),但是現在確實可以像魅力一樣工作。 – crasic 2010-10-30 22:10:38

3

pkgutil其中有iter_modules。 (注:The Python 2 documentation沒有提到的功能,但它工作得很好,我對Python的2.6。)

你也可以做到這一點使用__file__os.pathos.listdir手動。

0

爲什麼不製作所有驅動程序的包?然後,你可以

import drivers 
drivers.load("device1") 

其中load功能維護設備名稱的映射在封裝模塊?然後,您可以在需要時動態導入每個必需的模塊...