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

时间:2014-12-19 16:05:24

标签: python python-3.x python-import file-extension

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

显然,我想要.py,但我也希望包含.pyw.pyd等内容。换句话说,我想要任何可以导入的内容。

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

extensions = ['.py', '.pyw', ...]

1 个答案:

答案 0 :(得分:7)

此功能可在importlib.machinery module中找到。在内部,有许多常量与各种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']
>>>

所以,你可以很容易地将它们加入一个全局集 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'}
>>>

您可能也对all_suffixes function

感兴趣
>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.pyd']
>>>

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

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

这将确保.pyc.pyo都在集合中。


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

来自docs

  

importlib.machinery.BYTECODE_SUFFIXES

     

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

我没有打扰使用此常量,因为我想在集合中同时使用OPTIMIZED_BYTECODE_SUFFIXESDEBUG_BYTECODE_SUFFIXES。所以,没有理由添加它。


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