【问题标题】:Importing Modules from Python Package without specifying their names从 Python 包中导入模块而不指定它们的名称
【发布时间】:2013-07-21 03:38:19
【问题描述】:

我正在尝试在 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 模块,而是通过导入获取 foo 包。

如何获取 bar1 和 bar2 模块?

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

【问题讨论】:

    标签: python import module package


    【解决方案1】:

    来自import documentation

    name 变量为package.module 形式时,通常返回顶级包(直到第一个点的名称),不是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 中详细描述了导入的正式细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多