Python是否保证模块文件名中扩展的导入顺序?

Python是否保证模块文件名中扩展的导入顺序?,python,python-import,python-extensions,Python,Python Import,Python Extensions,通过实验,我验证了当编译的扩展名.pyd(或.so)和普通扩展名.py都存在于同一目录中时,首先导入.pyd文件;只有在未找到.pyd文件时,才会导入.py: [1]中的:导入扩展 在[2]中:扩展名__ Out[2]:'extension.pyd' 在[3]中:导入glob;glob.glob(“extension.py*”) Out[3]:['extension.py','extension.pyd'] 这对所有版本的Python都是一样的吗?我可以依靠它向.py文件添加逻辑吗?只有当.p

通过实验,我验证了当编译的
扩展名.pyd
(或
.so
)和普通
扩展名.py
都存在于同一目录中时,首先导入
.pyd
文件;只有在未找到
.pyd
文件时,才会导入
.py

[1]中的
:导入扩展
在[2]中:扩展名__
Out[2]:'extension.pyd'
在[3]中:导入glob;glob.glob(“extension.py*”)
Out[3]:['extension.py','extension.pyd']

这对所有版本的Python都是一样的吗?我可以依靠它向
.py
文件添加逻辑吗?只有当
.pyd
文件找不到时,才会执行该文件?

FWIW,我找不到一个说明必须在py文件之前加载扩展名的引用,因此,将其视为实现细节可能更安全(除非有人提供参考)。即使这些细节对于所有版本都是稳定的,至少可以追溯到2.7

导入模块时,首先在缓存中查找(即),如果尚未在缓存中查找,则使用中的查找器。通常,
sys.meta_path
BuiltinImporter
frozenporter
组成,其中
PathFinder
负责查找磁盘上的模块/python路径

PathFinder
提供了一些缓存功能来加快查找速度,但基本上是从-例如,可以在中找到概述

通常,
sys.path\u hooks
zipimporter
组成,它使压缩文件的导入成为可能,一个包裹的文件,它是整个导入机器的工作马

FileFinder
按给定顺序尝试不同的后缀(即
.so
.py
.pyc
),该顺序由以下步骤确定:

可以看出:

  • 扩展名位于源文件(即py文件)之前
  • 源文件位于pyc文件之前
显然,
sys.meta_path
以及
sys.path_hooks
可以通过某种方式进行操作,从而建立任意的加载首选项顺序


个人提示:我会尽量避免py-和so/pyd文件相邻的情况。

谢谢,这是一个经过充分研究的答案!我基本上默认了相同的想法(避免这种情况),因为标准中没有明确定义的行为。
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
    bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
    return [extensions, source, bytecode]