這實際上是依賴於平臺的,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年開始了這個明顯增加了「模塊」的變化。所以「作爲可能的後綴:http://hg.python.org/cpython-fullhistory/diff/8efa37a770c6/Python/importdl.c。所以這些改變最初是爲NeXTStep(最終成爲Mac OS X的)添加的,僅用於特定的鏈接設置。我不知道這個操作系統,因此很難說出它爲什麼是完成 - 我懷疑這只是爲了防止命名衝突,例如一個框架庫foo.so
可能已經加載,操作系統將不允許加載另一個相同名稱的庫,因此foomodule.so
是一個折衷方案,允許使用名稱的Python模塊foo
到儘管如此存在
編輯:。以上是錯的一段 - 我沒有走得足夠遠回顧歷史,得益於senderle指出了這一點事實上,有趣的變化似乎是http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c從1994年h是添加新模塊命名方案(foo.so
)作爲舊方案(foomodule.so
)的替代方案。我猜舊格式在某些時候已被棄用,因爲在該代碼的許多重寫之一中,對於Windows等某些平臺的支持已被刪除。請注意,即使在首次推出時,短模塊名稱版本也首先列出 - 這意味着它已經是首選變體。我從1994年開始搜索郵件列表/新聞組,看看這個變化是否在某個地方被討論過 - 看起來並不像這樣,Guido van Rossum似乎在沒有告訴任何人的情況下實現了它。
有趣,我不知道那個完整的歷史瀏覽器。那裏有一些深層的機構記憶。然而,定義'#define LONG_EXT「module.so」' - 如果這就是你所指的 - 在你正在討論的補丁早有很長時間了。事實上,當['importdl.c'](http://hg.python.org/cpython-fullhistory/file/d7e91437f0a2/Python/importdl.c)首次創建時,它就在那裏! – senderle 2011-06-30 14:50:25
@senderle:謝謝,我確實犯了一個錯誤。 'importdl.c'是在重寫中創建的,原始代碼可以在'import.c'中找到 - 我發現引入了兩個命名方案並更新了我的答案的更改。太糟糕了,Pythons的機構記憶不包括導致變化的討論。 – 2011-06-30 15:07:12