这实际上是平台相关的,Python 会根据操作系统尝试不同的后缀。这里是import.c中后缀表的初始化:
#ifdef HAVE_DYNAMIC_LOADING
memcpy(filetab, _PyImport_DynLoadFiletab,
countD * sizeof(struct filedescr));
#endif
memcpy(filetab + countD, _PyImport_StandardFiletab,
countS * sizeof(struct filedescr));
filetab[countD + countS].suffix = NULL;
_PyImport_Filetab = filetab;
所以它加入了两个列表,_PyImport_DynLoadFiletab 和 _PyImport_StandardFiletab。后者更简单,它在同一个文件中定义为[".py", ".pyw", ".pyc"](第二个条目仅存在于 Windows 上)。 _PyImport_DynLoadFiletab 在各种 dynload_<platform>.c 文件中定义。在基于 Unix 的系统上,它的值是 [".so", "module.so"],对于 CygWin,它定义为 [".dll", "module.dll"],而对于 OS/2,它是 [".pyd", ".dll"],对于 Windows,它只是 [".pyd"]。
我浏览了源代码历史,最终得出了自 1999 年以来的这一变化,显然添加了“module.so”作为可能的后缀:http://hg.python.org/cpython-fullhistory/diff/8efa37a770c6/Python/importdl.c。因此,这些更改最初是为 NeXTStep(最终成为 Mac OS X)添加的,仅用于特定的链接设置。我不知道这个操作系统,所以很难说出它为什么会这样做——我怀疑这只是为了防止命名冲突。例如。可能已经加载了框架库foo.so,并且操作系统不允许加载另一个同名的库。所以foomodule.so 是一种妥协,允许名称为foo 的Python 模块仍然存在。
编辑:上面的段落是错误的 - 我没有深入了解历史,感谢 senderle 指出这一点。事实上,有趣的变化似乎是从 1994 年开始的 http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c,它添加了一个新的模块命名方案 (foo.so) 作为旧方案 (foomodule.so) 的替代方案。我猜想旧形式在某个时候已被弃用,因为在对该代码的众多重写之一中已删除了对某些平台(如 Windows)的支持。请注意,即使在首次引入时,也会首先列出短模块名称版本 - 这意味着它已经是首选变体。
Edit2:我搜索了 1994 年的邮件列表/新闻组,看看是否在某个地方讨论过这个变化 - 看起来不像,Guido van Rossum 似乎在没有告诉任何人的情况下实现了它.