2011-12-06 136 views
3

我正在研究一個插件體系結構,需要將包名稱(如「foo.bar」)轉換爲代碼所在的絕對路徑。 imp.find_module似乎做我想做的事情,除非通過egg-link(通過'pip install develop'安裝)安裝代碼。如何找到通過egg-link安裝的python軟件包的位置?

如果有兩個模塊foo.bar和foo.bar2通過egg-links安裝(並且它們位於完全獨立的文件系統位置,如/ home/bob/foo/bar和/ home/alice/foo/bar2),find_modules不起作用,因爲我查找包「foo」並將位置設置爲foo/bar,但不是foo/bar2。

任何人都有其他功能的建議嗎? find_modules不接受層次結構名稱,所以我不能將「foo.bar2」傳遞給它。

回答

5

最簡單的方法是隻導入模塊,並檢查其屬性__file__

import os 
import foo.bar 

print(os.path.abspath(foo.bar.__file__)) 

對於動態進口:

import os 
import sys 

module_name = 'foo.bar' 
__import__(module_name) 
print(os.path.abspath(sys.modules[module_name].__file__)) 
+0

由於這些插件,我不知道包名提前,因此不能使用導入。我需要像「foo.bar」這樣的字符串並將其轉換爲包位置。 – cberner

+0

@cberner:您可以使用帶'__import__'的動態導入,查看我的更新答案的示例。 –

+0

如果您不知道軟件包名稱,那麼您如何使用find_module? (對於這個問題,爲什麼不直接使用你的插件系統的入口點?) –