从Python包导入模块而不指定其名称

时间:2013-07-22 11:55:49

标签: python import module package

我正在尝试动态导入Python中的模块。 这意味着 - 我有一个包含模块的Python包。 如果不指定模块名称,我想将每个模块名称的字典保存到指向该模块的指针。

我尝试使用this discussion

中的建议

我的目录是:

foo/
    __init__.py
    bar1.py
    bar2.py

我使用的脚本是:

import pkgutil
import foo

for importer, name, ispkg in pkgutil.iter_modules(foo.__path__, foo.__name__ + "."):
    print "Found submodule %s (is a package: %s)" % (name, ispkg)
    module = __import__(name)
    print "Imported", module

第一次迭代得到的输出是:

Found submodule foo.bar1 (is a package: False)
Imported <module 'foo' from '/path/to/foo/__init__.pyc'>

因此,我没有使用它来获取我的bar1模块,而是使用import导入foo包。

如何获得bar1和bar2模块?

如果使用pkgutil不正确,欢迎使用其他方法。

1 个答案:

答案 0 :(得分:0)

来自import documentation

  

name 变量的格式为package.module时,通常会返回顶级包(直到第一个点的名称), not name 命名的模块。但是,当给出非空 fromlist 参数时,将返回由 name 命名的模块。

此外,导入包似乎已足以使用该子模块:

anthony@claudia:~$ python
Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.path.join('one', 'two')
'one/two'
>>> 

反过来说,导入子模块会隐式导入其父模块:

Python 2.7.3 (default, Jan  2 2013, 13:56:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os.path
>>> os.tmpfile()
<open file '<tmpfile>', mode 'w+b' at 0x7f565495d4b0>
>>>

因此,简单地导入foo就足够了。

导入的正式细节详见documentation