[英]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()
在包的__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
从软件包外部,使用绝对导入:
import package.module
要求知道模块名称。
从包的__init__.py
,使用绝对导入:
import module
要求知道模块名称。
在包的__init__.py
,设置__all__
:
__all__ = ['module']
需要使用:
from package import *
这会污染名称空间,在任何情况下都可能很危险,但在这种情况下尤其危险,因为模块的名称未知。
从软件包的__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
在包的__init__.py
,使用importlib
似乎没有简单的方法来识别可导入的模块和子包,除非可能通过导入所有内容并捕获错误,并且这些错误的肯定错误消息使在模块时更难以捕获合法问题。导入失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.