gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:59:34 54 4
gpt4 key购买 nike

通过实验,我验证了当编译 extension.pyd (或 .so )和普通 extension.py两者都存在于同一目录中,.pyd文件首先被导入; .py仅在 .pyd 时才被导入找不到文件:

In [1]: import extension

In [2]: extension.__file__
Out[2]: 'extension.pyd'

In [3]: import glob; glob.glob("extension.py*")
Out[3]: ['extension.py', 'extension.pyd']

是否保证所有版本的 Python 都相同,我可以依靠它向 .py 添加逻辑吗?仅在 .pyd 时执行的文件找不到文件?

最佳答案

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

导入模块时,它首先在缓存中查找(即 sys.modules ),如果还没有,则从 sys.meta_path 中查找。被使用。通常,sys.meta_pathBuiltinImporterFrozenImporterPathFinder 组成,其中 PathFinder 负责在磁盘/python 路径上查找模块。

PathFinder 提供了一些缓存功能来加速查找,但它基本上是 delegates the searchhooks来自 sys.path_hooks - 概述可以在例如 PEP 302 中找到.

通常,sys.path_hookszipimporter 组成,这使得压缩文件的导入成为可能,and包裹 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
bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
return [extensions, source, bytecode]

如你所见:

  • 扩展名在源文件(即 py 文件)之前
  • 源文件在 pyc 文件之前

显然,sys.meta_path 以及 sys.path_hooks 可以通过某种方式进行操作,从而建立任意顺序的加载首选项。

作为个人说明:我会尽量避免 py- 和 so/pyd- 文件彼此相邻的情况。

关于python - Python 是否保证模块文件名中扩展名的导入顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56004885/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com