2011-10-21 175 views
2

python可以從文件夾/包中獲取模塊列表並導入它們嗎?在Python中導入模塊文件夾

我希望能夠通過類內部的函數來完成此操作,以便整個類都可以訪問它們(可能從__init__方法完成)。

任何幫助將不勝感激。

+0

'從包導入*'和'dir(包)'是否不夠?請注意,'dir'是一個Python命令,也是一個命令行。 – Hannele

+0

@Hannele這真的對你有用嗎?我沒有提及'package'中的模塊,我得到'['__builtins__','__doc__','__file__','__name__','__package__','__path __']'。但是,如果模塊本身是明確導入的,則「dir」顯示這些模塊,但這會挫敗問題的目的。 –

+0

我可能需要再次檢查文件夾的工作方式 - 文件夾中是否有__init __。py'文件?即使是空的,這也是python將文件夾視爲模塊的原因。 – Hannele

回答

3

modules document

唯一的解決方案是軟件包作者提供一個明確的 包的索引。導入語句使用以下 約定:如果程序包的__init__.py代碼定義了名爲 __all__的列表,則它將被視爲在遇到包import *時應導入的模塊名列表。 軟件包作者發佈 軟件包的新版本時,可以使此列表保持最新。如果軟件包作者沒有看到從其軟件包中導入*的用法,則封裝作者也可能決定不支持 。對於 例如,文件的聲音/效果/ __init__.py可能包含 下面的代碼:

__all__ = ["echo", "surround", "reverse"] 

這將意味着從sound.effects導入*將導入的聲音包的三個命名的子模塊。

是的,你可以通過爲目錄中的文件做目錄列表並找到一個方法來手動導入它們。但是,你所要求的內容沒有內置的語法。

0

可以知道模塊列表與dir函數

import module 
dir (module) 

在程序以後,可以導入一個單一的功能:

from module import function 
+0

當我嘗試'dir(foo)'(使用'foo'作爲一個包)時,我得到了'['__builtins__','__doc__','__file__','__name__','__package__','__path __']'不包含包中的模塊列表。 –

+0

@EricWilson'>>> type(dir(sys)) ' – Griffin

+2

這不會得到你的模塊列表。這將爲您提供包的屬性列表(如包的目錄的__init __。py'文件中所定義的)。如果在'__all__'變量中明確聲明瞭包的模塊,那麼它只包含在這個列表中。 –

0

distribute模塊提供了確實的機制這很多。首先,你可以通過使用pkg_resources.resource_listdir包列出Python文件開始:

>>> module_names = set(os.path.splitext(r)[0] 
...  for r 
...  in pkg_resources.resource_listdir("sqlalchemy", "/") 
...  if os.path.splitext(r)[1] in ('.py', '.pyc', '.pyo', '') 
... ) - set(('__init__',)) 
>>> module_names 
set(['engine', 'util', 'exc', 'pool', 'processors', 'interfaces', 
'databases', 'ext', 'topological', 'queue', 'test', 'connectors', 
'orm', 'log', 'dialects', 'sql', 'types', 'schema']) 

然後,您可以導入每個模塊中的循環:

modules = {} 
for module in module_names: 
    modules[module] = __import__('.'.join('sqlalchemy', module))