imp
进出口 - 访问进口内部
该模块为用于实现该import
语句的机制提供了一个接口。它定义了以下常量和函数:
imp.get_magic()
返回用于识别字节编译代码文件(.pyc
文件)的魔术字符串值。(对于每个Python版本,此值可能不同。)
imp.get_suffixes()
返回3元组元组列表,每个元组描述一个特定类型
的模块。每个三元组都有这样的形式(suffix, mode, type)
,其中后缀
是一个字符串,要附加到模块名称以形成要搜索的文件名,模式
是要传递给内置open()
函数以打开文件的模式
字符串(可以'r'
用于文本文件或'rb'
二进制文件),和类型
是文件类型
,其具有的一个值PY_SOURCE
,PY_COMPILED
或者C_EXTENSION
,如下所述。
imp.find_module(name[, path])
尝试找到模块名称
。如果省略了路径
,或者搜索None
给出的目录名称
列表sys.path
,但是首先搜索几个特殊的地方:函数试图找到具有给定名称
(C_BUILTIN
)的内置模块,然后是冻结模块(PY_FROZEN
),以及在某些系统上也会查看其他地方(在Windows上,它会在注册表中查找可能指向特定文件的地方)。
否则,路径
必须是目录名称列表; 每个目录都会搜索具有get_suffixes()
上述返回的任何后缀的文件。列表中无效的名称将被忽略(但所有列表项必须是字符串)。
如果搜索成功,则返回值是一个3元组元组(file, pathname, description)
:
文件
是一个位于开头的打开的文件
对象,pathname
是找到的文件
的路径名,description
是一个3元元组,包含在通过get_suffixes()
描述找到的模块类型返回的列表中。
如果模块不在文件
中,则返回的文件
是None
,pathname
是空字符串,描述
元组的后缀和模式包含空字符串; 模块类型如上面的括号中所示。如果搜索不成功,ImportError
则提出。其他例外表明争论或环境问题。
如果模块是一个包,文件
是None
,pathname
是包路径,并且描述
元组中的最后一个项是PKG_DIRECTORY
。
此功能不处理分层模块名称(包含点的名称)。为了找到PM
,即,子模块中号
包的P
,使用find_module()
和load_module()
查找和负载包P
,然后使用find_module()
与路径
设置为参数P.__path__
。当P
本身具有虚线名称时,递归应用此配方。
imp.load_module(name, file, pathname, description)
加载以前找到的模块find_module()
(或通过其他方式执行的搜索生成兼容的结果)。这个功能不仅仅是导入模块:如果模块已经被导入,它相当于一个reload()
!该名称
参数表示全模块名(包括包名,如果这是一个封装的子模块)。该文件
的说法是一个开放的文件
,路径
是相应的文件
名; 这些可以是None
和''
,分别,当模块是一个包或不被从文件
中加载。该描述
参数是一个元组,如将被退还get_suffixes()
,说明什么样的模块必须加载。
如果加载成功,则返回值是模块对象; 否则,会引发异常(通常ImportError
)。
重要提示:
调用者负责关闭文件
参数,如果不是None
,即使发生异常。这最好使用try
... finally
语句完成。
imp.new_module(name)
返回一个名为name
的新的空模块对象。该对象未被
插入sys.modules
。
imp.lock_held()
如果导入锁定当前被保持,则返回True
;否则False
。在没有线程的平台上,总是返回False
。
在具有线程的平台上,执行导入的线程持有内部锁,直到导入完成。此锁可阻止其他线程进行导入,直到原始导入完成,这反过来阻止其他线程在完成其导入过程中查看由原始线程构建的不完整模块对象(以及由此引发的导入(如果有) )。
imp.acquire_lock()
获取当前线程的解释器导入锁。导入模块时应该使用此锁定导入钩子以确保线程安全。
一旦一个线程获得了导入锁定,同一个线程可以再次获得它而不会阻塞;线程每次获取它时都必须释放一次。
在没有线程的平台上,这个函数什么都不做。
2.3版本的新功能。
imp.release_lock()
释放解释器的导入锁定。在没有线程的平台上,这个函数什么都不做。
2.3版本的新功能。
以下在本模块中定义的具有整数值的常量用于指示搜索结果find_module()
。
imp.PY_SOURCE
该模块被发现为源文件。
imp.PY_COMPILED
该模块被发现是一个编译的代码对象文件。
imp.C_EXTENSION
该模块被发现是可动态加载的共享库。
imp.PKG_DIRECTORY
该模块被发现为一个软件包目录。
imp.C_BUILTIN
该模块被发现是一个内置模块。
imp.PY_FROZEN
该模块被发现为冻结模块(请参阅init_frozen()
)。
以下常数和功能已过时;他们的功能可以通过find_module()
或load_module()
。它们保持向后兼容
imp.SEARCH_ERROR
没用过。
imp.init_builtin(name)
初始化名为name的
内置模块并返回其模块对象并将其存储sys.modules
。如果模块已经初始化,它将被重新
初始化。重新
初始化涉及__dict__
通过模块的入口复制缓存模块中的内置模块sys.modules
。如果没有名为name的
内置模块,None
则返回。
imp.init_frozen(name)
初始化名为name
的冻结
模块并返回其模块对象。如果模块已经初始化,它将被重新
初始化。如果没有冻结
模块调用的名称
,None
则返回。(冻结
模块是用Python编写的模块,其编译的字节码对象被Python的冻结
工具整合到定制的Python解释器中,请参阅Tools/freeze/
。)
imp.is_builtin(name)
返回1
如果有一个内置的模块调用的名字
,可以再次进行初始化。-1
如果有名为name的
内置模块返回,则无法再次初始化(请参阅参考资料init_builtin()
)。如果没有名为name的
内置模块,则返回0
。
imp.is_frozen(name)
True
如果存在冻结模块(请参阅init_frozen()
),则返回名称
,或者False
如果没有此类模块。
imp.load_compiled(name, pathname[, file])
加载并初始化一个实现为字节编译代码文件
的模块并返回其模块对象。如果模块已经初始化,它将被重新
初始化。的名称
参数被用来创建或访问模块对象。该路径
参数指向字节编译的代码文件
。该文件
的说法是字节编译的代码文件
,打开用于读取二进制模式,从一开始。它目前必须是一个真正的文件
对象,而不是模拟文件
的用户定义的类。
imp.load_dynamic(name, pathname[, file])
加载并初始化一个实现为动态可加载共享库的模块并返回其模块对象。如果模块已经初始化,它将被重新
初始化。重新
初始化包括将__dict__
缓存的模块实例的属性复制到缓存模块中使用的值上sys.modules
。该路径
参数必须指向共享库。的名称
参数被用来构建所述初始化功能的名称
:称为外部C函数initname()
在共享库被调用。可选的文件
参数被忽略。(注意:使用共享库依赖于高度系统,并非所有系统都支持它。)
CPython实现细节:
导入内部通过文件名标识扩展模块,因此无论是否导出函数foo = load_dynamic("foo", "mod.so")
,bar = load_dynamic("bar", "mod.so")
都会导致foo和bar引用相同的模块。在支持它们的系统上,可以使用符号链接从同一共享库中导入多个模块,因为对模块的每个引用都将使用不同的文件名。mod.soinitbar
imp.load_source(name, pathname[, file])
加载并初始化一个作为Python源文件
实现的模块并返回它的模块对象。如果模块已经初始化,它将被重新
初始化。的名称
参数被用来创建或访问模块对象。该路径
参数指向源文件
。该文件
的说法是源文件
,打开阅读文本,从一开始。它目前必须是一个真正的文件
对象,而不是模拟文件
的用户定义的类。请注意,如果存在正确匹配的字节编译文件
(带有后缀.pyc
或.pyo
),则将使用它来代替解析给定的源文件
。
class imp.NullImporter(path_string)
NullImporter
类型是一个PEP 302
导入挂钩,通过无法找到任何模块来处理非目录路径字符串。用现有目录或空字符串调用此类型引发ImportError
。否则,NullImporter
返回一个实例。
Python将这种类型的实例添加到sys.path_importer_cache
任何不是目录的路径条目,并且不会被任何其他路径挂钩处理sys.path_hooks
。实例只有一个方法:
find_module(fullname[, path])
此方法始终返回None
,表示找不到请求的模块。
2.5版本中的新功能。
1.例子
以下函数模拟Python 1.4以前的标准导入语句(没有层次模块名称)。(这个实现
在那个版本中不起作用,因为find_module()
已经被扩展并且load_module()
已经被添加到1.4中。)
import imp
import sys
def __import__(name, globals=None, locals=None, fromlist=None):
# Fast path: see if the module has already been imported.
try:
return sys.modules[name]
except KeyError:
pass
# If any of the following calls raises an exception,
# there's a problem we can't handle -- let the caller handle it.
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
# Since we may exit via an exception, close fp explicitly.
if fp:
fp.close()
reload()
可以在模块中找到更完整的实现分层模块名称并包含函数的示例knee
。该knee
模块可以Demo/imputil/
在Python源代码分发中找到。