__import__ 与动态加载 python module,__import_python,OpenStack 的
__import__ 与动态加载 python module,__import_python,OpenStack 的
Direct use of __import__() is rare, except in cases where you want to import a module whose name is only known at runtime.
本文介绍 python module 的动态加载,我们有时希望从配置文件等地获取要被动态加载的 module,但是所读取的配置项通常为字符串类型,无法用 import 加载,例如:
>>> import 'os' File "<stdin>", line 1 import 'os' ^ SyntaxError: invalid syntax
Python 提供内建函数 __import__ 动态加载 module,__import__ 的用法如下:
__import__ (name[, globals[, locals[, fromlist[, level]]]])
- name (required): 被加载 module 的名称
- globals (optional): 包含全局变量的字典,该选项很少使用,采用默认值 global()
- locals (optional): 包含局部变量的字典,内部标准实现未用到该变量,采用默认值 local()
- fromlist (Optional): 被导入的 submodule 名称
- level (Optional): 导入路径选项,默认为 -1,表示同时支持 absolute import 和 relative import
>>> os_module = __import__('os') >>> print os_module.path <module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
事实上,import 本质上是调用 __import__ 加载 module 的,比如:
import foo 最终调用如下函数实现 foo = __import__('foo', globals(), locals(), [], -1)
但如果使用不善,也容易踩坑:
>>> __import__("os") <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'> >>> __import__("os.path") <module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
如果输入的参数如果带有 “.”,采用 __import__ 直接导入 module 容易造成意想不到的结果。 OpenStack 的 oslo.utils 封装了 __import__,支持动态导入 class, object 等。
import sys import traceback def import_class(import_str): """Returns a class from a string including module and class. .. versionadded:: 0.3 """ mod_str, _sep, class_str = import_str.rpartition('.') __import__(mod_str) try: return getattr(sys.modules[mod_str], class_str) except AttributeError: raise ImportError('Class %s cannot be found (%s)' % (class_str, traceback.format_exception(*sys.exc_info()))) def import_object(import_str, *args, **kwargs): """Import a class and return an instance of it. .. versionadded:: 0.3 """ return import_class(import_str)(*args, **kwargs) def import_module(import_str): """Import a module. .. versionadded:: 0.3 """ __import__(import_str) return sys.modules[import_str]
相关内容
- Python标准库系列之模块介绍,python标准库模块, 模块分
- Python 中 import 的机制与实现,pythonimport, 概述 Python 是
- Mac os下Python3安装Django,python3django,1.查看pip版本
- python numpy中sum()时出现负值,pythonnumpy,import num
- Python3.X Socket 一个编码与解码的坑,python3.xsocket,最近在
- 如何用python爬取两个span之间的内容,pythonspan,Python用做
- 关于Python pandas模块输出每行中间省略号问题,pythonpa
- centos6.5下安装OpenCV+Python支持,centos6.5opencv,Python调用o
- Python全栈之路--Django ORM详解,--djangoorm,ORM:(在djan
- python编写商品管理,python编写商品,# 1、实现
评论关闭