繁体   English   中英

我将如何创建然后导入包含未指定模块集的软件包?

[英]How would I create and then import a package containing an unspecified set of modules?

使用Python 3.3或更高版本,如何创建然后导入包含未指定模块集的软件包? 我希望导入包中的所有模块,而不必按名称导入每个模块。 这将允许将新模块添加到包中,并且下次导入包时,可以自动加载新模块,而无需对包进行任何其他更改。

从软件包外部,我想导入和使用该软件包,如下所示:

import package
package.module.function()

从包内部,我想导入并使用同级模块看起来像这样:

from . import sibling
sibling.function()

或这个:

import package.sibling
package.sibling.function()

在Python 3.3或更高版本中,使用pkgutil搜索程序包目录,并使用importlib加载每个模块。

在包的__init__.py

# Import standard modules.
import importlib
import os
import pkgutil

# For each module in the current directory...
for void, module_name, void in pkgutil.iter_modules([os.path.dirname(__file__)]):

    # Import the module.
    importlib.import_module(__name__+'.'+module_name)

上面的内容可以移到一个库中,之后该包的__init__.py变得简单:

# Import local modules.
import loader

# Load all modules in the current directory.
loader.load_all_modules(__file__,__name__)

请注意, importlib机制是在Python 3.1中引入的,并在Python 3.3中进行了重大更新,并且上述方法尚未在Python 3.1.x或3.2.x中进行测试。

https://docs.python.org/3.3/library/importlib.html#importlib.import_module https://docs.python.org/3.3/library/pkgutil.html#pkgutil.iter_modules

其他失败方法

尝试1

从软件包外部,使用绝对导入:

import package.module

要求知道模块名称。

尝试2

从包的__init__.py ,使用绝对导入:

import module

要求知道模块名称。

尝试3

在包的__init__.py ,设置__all__

__all__ = ['module']

需要使用:

from package import *

这会污染名称空间,在任何情况下都可能很危险,但在这种情况下尤其危险,因为模块的名称未知。

尝试4

从软件包的__init__.py ,使用pkgutil标识和导入软件包中的所有模块似乎可以进行导入,但仅模拟本机导入机制,而不会更新sys.modules字典。 当包中的模块尝试导入同级模块时,这会导致问题,例如:

未在sys.modules中列出会导致相对导入失败,并显示以下消息:

父模块“”未加载,无法执行相对导入。

http://hg.python.org/cpython/file/f7992397e98d/Lib/importlib/_bootstrap.py#l1518

另外,绝对导入会重新加载要导入的模块。

https://docs.python.org/3.3/library/imp.html#imp.load_module http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html#the-double-import-trap

尝试5

在包的__init__.py ,使用importlib似乎没有简单的方法来识别可导入的模块和子包,除非可能通过导入所有内容并捕获错误,并且这些错误的肯定错误消息使在模块时更难以捕获合法问题。导入失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM