我正在尝试动态导入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不正确,欢迎使用其他方法。
答案 0 :(得分:0)
当 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。