Python 有没有一种简单的方法可以获得所有通用模块扩展?
我正在制作一个处理Python模块的库。在不深入讨论细节的情况下,我需要一个常见Python模块扩展的列表 显然,我想要Python 有没有一种简单的方法可以获得所有通用模块扩展?,python,python-3.x,python-import,file-extension,Python,Python 3.x,Python Import,File Extension,我正在制作一个处理Python模块的库。在不深入讨论细节的情况下,我需要一个常见Python模块扩展的列表 显然,我想要.py,但我也希望包括.pyw、.pyd等。换句话说,我想要任何可以导入的内容 标准库中是否有工具可以为我列出此列表?或者我必须自己制作(并硬编码所有的值) 此功能可在中找到。内部有许多与各种Python模块扩展相关的常量: >>> import importlib >>> importlib.machinery.SOURCE_SUFFIXE
.py
,但我也希望包括.pyw
、.pyd
等。换句话说,我想要任何可以导入的内容
标准库中是否有工具可以为我列出此列表?或者我必须自己制作(并硬编码所有的值)
此功能可在中找到。内部有许多与各种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中:
您可能还对以下内容感兴趣: 但是请注意,如果Python是使用以下两种方法之一启动的,则此函数将用
.pyo
替换.pyc
。要避免这种情况,您可以执行以下操作:
>>> set(importlib.machinery.all_suffixes() +
... importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
... importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
这将确保.pyc
和.pyo
都在集合中
最后,您应该警惕importlib.machine.BYTECODE\u后缀。正如@MartijnPieters在评论中指出的,它将始终等于
优化字节码后缀
或调试字节码后缀
。这意味着,如果您将其添加到集合中,您将获得重复的.pyc
或重复的.pyo
值(除非您使用一组课程)
从:
importlib.machine.BYTECODE\u后缀
表示字节码模块的已识别文件后缀的字符串列表。设置为DEBUG\u字节码\u后缀
或
OPTIMIZED_BYTECODE_后缀
基于\u调试
是否为真
然而,我没有费心使用这个常量,因为我希望集合中既有优化的字节码后缀
又有调试字节码后缀
。因此,没有理由添加它
1我决定使用集合,因为它们的查找时间比列表快。这意味着,它们更适合于一个不会改变且不需要特定顺序的全球价值集合。此外,他们将确保我们不会意外地向集合中添加重复的扩展。注意
所有后缀()
还包括扩展模块;例如,在Mac上,这会给出['.py'、'.pyc'、'.cpython-34m.so'、'.abi3.so'、'.so']
。此外,附加importlib.machine.OPTIMIZED字节码后缀
或importlib.machine.DEBUG\u字节码\u后缀
,它们永远不等于importlib.machine.BYTECODE\u后缀
。否则,当使用-O
或-OO
运行时,您将有两次.pyo
。是的,一组更好。请参阅[importlib.machine.BYTECODE\u后缀
]()文档:*根据\u DEBUG\u字节码\u后缀
是否为真,设置为或优化的字节码\u后缀
*
>>> set(importlib.machinery.SOURCE_SUFFIXES +
... importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
... importlib.machinery.EXTENSION_SUFFIXES +
... importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>
>>> importlib.machinery.all_suffixes()
['.py', '.pyw', '.pyc', '.pyd']
>>>
>>> set(importlib.machinery.all_suffixes() +
... importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES +
... importlib.machinery.DEBUG_BYTECODE_SUFFIXES)
{'.pyw', '.py', '.pyd', '.pyc', '.pyo'}
>>>