有没有简单的方法来获得所有常见的模块扩展?

iCo*_*dez 6 python file-extension python-import python-3.x

我正在创建一个处理Python模块的库.没有详细介绍,我需要一个常见的Python模块扩展列表.

很显然,我想.py,但我也想加入的,如.pyw,.pyd等.换句话说,我想要的东西,你可以导入.

标准库中是否有一个工具可以为我制作这个列表?或者我必须自己制作(并硬编码所有值)?

extensions = ['.py', '.pyw', ...]
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 7

此功能可在importlib.machinery模块中找到.在里面,有许多常量与各种Python模块扩展相关:

>>> import importlib
>>> importlib.machinery.SOURCE_SUFFIXES
['.py', '.pyw']
>>> importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES
['.pyo']
>>> importlib.machinery.EXTENSION_SUFFIXES
['.pyd']
>>> importlib.machinery.DEBUG_BYTECODE_SUFFIXES
['.pyc']
>>>
Run Code Online (Sandbox Code Playgroud)

所以,你可以很容易地将它们加入到全局集1中:

>>> set(importlib.machinery.SOURCE_SUFFIXES +
...     importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
...     importlib.machinery.EXTENSION_SUFFIXES +
...     importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
Run Code Online (Sandbox Code Playgroud)

您可能也对该all_suffixes功能感兴趣:

>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.pyd']
>>>
Run Code Online (Sandbox Code Playgroud)

但请注意.pyc,.pyo如果使用-O-OO选项启动Python ,则此函数将替换.为避免这种情况,您可以:

>>> set(importlib.machinery.all_suffixes() +
...     importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
...     importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
Run Code Online (Sandbox Code Playgroud)

这将确保双方.pyc.pyo在设定的.


最后,你应该警惕importlib.machinery.BYTECODE_SUFFIXES.正如@MartijnPieters在评论中指出的那样,它总是等于OPTIMIZED_BYTECODE_SUFFIXES或者DEBUG_BYTECODE_SUFFIXES.这意味着如果将其添加到集合中,您将获得.pyc重复.pyo值或重复值(除非您使用一组过程).

来自文档:

importlib.machinery.BYTECODE_SUFFIXES

表示字节码模块的已识别文件后缀的字符串列表.设置为DEBUG_BYTECODE_SUFFIXES或者 OPTIMIZED_BYTECODE_SUFFIXES基于是否__debug__为真.

我没有打扰使用这个常量,因为我想要两个OPTIMIZED_BYTECODE_SUFFIXES并且DEBUG_BYTECODE_SUFFIXES在集合中.所以,没有理由添加它.


1我决定使用一个集合,因为它们的查找时间比列表快.意思是,它们更适合全球价值观的收集,这些价值观不会改变,也不需要特定的订单.此外,他们还将确保我们不会意外地向集合中添加重复的扩展.