这实际上是依赖于平台的,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似乎是在未告知任何人的情况下实施了此更改。



