0

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

我尝试使用此讨论中的建议

我的目录是:

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 模块,而是获取了带有导入的 foo 包。

如何获取 bar1 和 bar2 模块?

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

4

1 回答 1

0

导入文档

name变量是 formpackage.module时,通常返回顶层包(直到第一个点的名称),而不是name命名的模块。但是,当给定非空fromlist参数时,将返回按名称命名的模块。

此外,为了使用它的子模块,导入一个包似乎就足够了:

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就足够了。

文档中详细描述了导入的正式细节。

于 2013-07-22T12:41:39.900 回答