<p>这实际上是平台相关的,Python有不同的后缀,它根据操作系统来尝试。下面是<code>import.c</code>中后缀表的初始化:</p>
<pre><code>#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;
</code></pre>
<p>所以它连接两个列表,<code>_PyImport_DynLoadFiletab</code>和{<cd3>}。后者比较容易,它被定义为同一个文件中的<code>[".py", ".pyw", ".pyc"]</code>(第二个条目只在Windows上出现)。<code>_PyImport_DynLoadFiletab</code>在各种<code>dynload_<platform>.c</code>文件中定义。在基于Unix的系统上,它的值是<code>[".so", "module.so"]</code>,对于CygWin,它定义了<code>[".dll", "module.dll"]</code>,而对于OS/2,它的值是{<cd9>},对于Windows,它只是<code>[".pyd"]</code>。在</p>
<p><del>我查看了源代码历史,最终得出了1999年的更改,它显然增加了“模块.so“作为可能的后缀:<a href="http://hg.python.org/cpython-fullhistory/diff/8efa37a770c6/Python/importdl.c" rel="noreferrer">http://hg.python.org/cpython-fullhistory/diff/8efa37a770c6/Python/importdl.c</a>。因此,这些更改最初是为NeXTStep(最终成为macosx)添加的,只针对特定的链接设置。我不知道这个操作系统,所以很难说为什么这么做-我怀疑这只是为了防止命名冲突。E、 g.框架库<code>foo.so</code>可能已经加载,操作系统不允许加载同名的另一个库。尽管如此,{/cda}允许Python{/cda}存在</p>
<p><strong>编辑</strong>:上面的段落是错误的-我没有追溯到足够远的历史,多亏了senderle的指出。事实上,有趣的变化似乎是1994年以来的<a href="http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c" rel="noreferrer">http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c</a>,在那里添加了一个新的模块命名方案(<code>foo.so</code>),作为旧方案(<code>foomodule.so</code>)的替代方案。我想旧的表单在某个时候会被弃用,因为对它的支持已经在某些平台上被删除了,比如Windows,在对该代码的大量重写中。请注意,即使在第一次引入时,简短的模块名版本也被列在第一位,这意味着它已经是首选的变体。在</p>
<p><strong>Edit2</strong>:我搜索了1994年的邮件列表/新闻组,看看是否有人讨论过这一变化——它看起来不像,Guido van Rossum似乎没有告诉任何人就实现了它。在</p>