FWIW,我找不到参考说明,必须在py文件之前加载扩展,因此将其作为实现细节可能更安全(除非有人提供参考)。即使此细节对于所有版本都稳定到至少2.7。
导入模块时,它将首先在缓存中查找(即
sys.modules),如果尚未在其中,
sys.meta_path则使用from中的查找器。通常,
sys.meta_path由
Builtinimporter,
Frozenimporter和组成
PathFinder,其中
PathFinder负责在磁盘/
python-path上查找模块。
PathFinder提供了一些缓存功能,以加速查找,但它基本上代表所述搜索到钩从
sys.path_hooks-概述可以在例如发现PEP
302。
通常情况下,
sys.path_hooks包括
zipimporter,这使压缩文件的导入可能,和一个包裹
FileFinder,这是整个进口机械的工作马。
FileFinder尝试不同的出就足够了(即
.so,
.py,
.pyc)在给定的顺序,这是通过建立
_get_supported_file_loaders()-method:
def _get_supported_file_loaders(): """Returns a list of file-based module loaders. Each item is a tuple (loader, suffixes). """ extensions = ExtensionFileLoader, _imp.extension_suffixes() source = SourceFileLoader, SOURCE_SUFFIXES bytepre = SourcelessFileLoader, BYTECODE_SUFFIXES return [extensions, source, bytepre]
可以看到:
- 扩展名在源文件(即py文件)之前
- 源文件先于pyc文件
显然,
sys.meta_path以及
sys.path_hooks可以以某种方式进行 *** 纵,这将建立负载优先级的任意顺序。
作为个人说明:我将尽量避免py和so / pyd文件彼此相邻的情况。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)