当前位置: 首页 > 面试题库 >

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

阎京
2023-03-14
问题内容

通过实验,我验证了当同一目录中同时存在编译的extension.pyd(或.so)和Plain时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则使用from中的查找器。通常,sys.meta_pathBuiltinImporterFrozenImporter和组成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
    bytecode = SourcelessFileLoader, BYTECODE_SUFFIXES
    return [extensions, source, bytecode]

可以看到:

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

显然,sys.meta_path以及sys.path_hooks可以以某种方式进行操纵,这将建立负载优先级的任意顺序。

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



 类似资料:
  • 问题内容: 是否有从文件名中提取扩展名的功能? 问题答案: 使用(请参阅Python 2.X文档或Python 3.X文档): 与大多数手动字符串拆分尝试不同,它将正确地视为没有扩展而不是具有,并且将被视为没有扩展而不是具有:

  • 问题内容: 假设从CGI开始,我已经将文件显示为文件。我想将的文件扩展名更改为显示文件。我该怎么做? 问题答案: , 例如:

  • 问题内容: 在Python中,是否可以为导入的模块定义别名? 例如: …因此具有别名“ short_name”。 问题答案: 也适用于

  • 问题内容: 我有一个Python项目,其中包含许多与distutils打包在一起的子模块。我想在C中构建一些Python扩展以生活在其中一些子模块中,但是我不明白如何使Python扩展生活在子模块中。以下是我正在寻找的最简单的示例: 这是我的Python扩展: 这是可行的: 在virtualenv中安装后,我可以这样做: 但是,我想生活在一个子模块中。我需要在此管道中进行哪些更改才能使Python

  • 问题内容: 如何.txt在python中具有扩展名的目录中找到所有文件? 问题答案: 你可以使用: 或者简单地 或者如果要遍历目录,请使用

  • 问题内容: 快速的Google搜索至少会产生一个教程来为node.js 编写C ++“ Hello World” ,但是目前尚不清楚是否可以仅使用C编写这样的扩展。假设有可能,我将面临哪些挑战/局限? 问题答案: 您可以根据需要用C编写扩展的一部分,但是至少需要一点C ++代码才能将C代码与Node粘合在一起。 正如您在HelloWorld中所看到的那样,扩展依赖于和标头,其中包含Node期望的所