2011-10-21 124 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))