Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种简单的方法可以获得所有通用模块扩展?_Python_Python 3.x_Python Import_File Extension - Fatal编程技术网

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

我正在制作一个处理Python模块的库。在不深入讨论细节的情况下,我需要一个常见Python模块扩展的列表

显然,我想要
.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'}
>>>