2012-03-26 74 views
2

我目前正在爲python寫一個自動完成。因此我需要找到導入的模塊。python如何使用imp.find_module或替代

對於imp.find_module,這看起來很簡單,但如果插入一條對自動完成很重要的路徑,它就不起作用。插入路徑意味着它不會找到系統模塊。

解決方法是獲取PYTHONPATH,然後插入它。但是,這並不是一個很好的方法,因爲我只想要默認路徑。此外PYTHONPATH甚至不在我的os.environ []中。

這個複雜的程序真的沒有其他選擇嗎?如果沒有,我怎樣才能得到庫的默認路徑?

是否有更好的解決方案,通過目錄自動爬網?

注:由於我正在寫一個自動完成,我不想實際導入/執行任何代碼。

+0

所以,你想自動完成一個'import'語句與自定義模塊搜索路徑集,包括標準/系統模塊? – 2012-03-26 23:54:12

+0

是的,這就是我想要的。但是我最終需要一個文件的源代碼(如果它不像'時間'那樣的庫)。 – 2012-03-27 00:10:16

回答

1

爲了讓標準庫的路徑中使用:

>>> import sys 
>>> sys.path 
['', '/usr/lib/python27.zip', '/usr/lib/python2.7', ...] 

使用這些路徑,你可以通過他們搜索使用os.listdir,如:

import sys, os 
standardlib = os.listdir(sys.path[n]) 

你必須檢查,如果你檢查如果路徑是一個目錄。

stdlibs = [] 
for lib in sys.path: 
    if os.path.isdir(lib): 
     for module in os.listdir(lib): 
      stdlibs.append(lib + "/" + module) 

您可能需要遞歸檢查並檢查擴展名。

這會讓你知道從哪裏開始。

您還需要檢查當前目錄(os.getcwd())是否可以成爲包(python package structure)的一部分的文件。

+0

這不是這個問題的關鍵。這是關於找到可以*導入的模塊,但可能不是。所以實際的解決方案必須涉及一些目錄遍歷和東西。 – 2012-03-27 00:43:22

+0

你說得對。我誤解了這個問題。我會更新我的答案。 – veiset 2012-03-27 00:52:27

+0

我現在接受了你的答案,因爲我不再真正理解我自己的問題。但是,使用'imp.find_module'可以實現下面的導入路徑,並通過'pkgutil.iter_modules'輕鬆地列出目錄中的Python模塊/軟件包(或所有全局模塊)。 – 2012-07-17 22:24:13