gpt4 book ai didi

Python 共享对象模块命名约定

转载 作者:IT老高 更新时间:2023-10-28 20:53:23 25 4
gpt4 key购买 nike

我已经用 C++ 编写了一个 Python 模块并将其构建为共享对象库,它运行良好。但是在弄清楚这一切的同时,我注意到(通过 strace)Python 会寻找一些不同的变体 import 被调用。特别是,当我说 import foo 时,Python 会按顺序搜索:

  • foo(一个目录)
  • foo.so
  • foomodule.so
  • foo.py
  • foo.pyc

除了 foomodule.so 之外,这一切都很好理解。为什么 Python 会同时查找 name.so 和 namemodule.so 的所有内容?是不是什么历史文物?我进行了相当多的搜索,但根本没有给出任何解释,我想知道是否应该将我的模块命名为 foomodule.so 而不是 foo.so。我的系统似乎有一些遵循每个约定的现有 Python 模块,所以我不禁想知道不同的名称是否意味着什么。

最佳答案

这实际上是平台相关的,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 指出这一点。事实上,有趣的变化似乎是 http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c从 1994 年开始,添加了新的模块命名方案 (foo.so) 作为旧方案 (foomodule.so) 的替代方案。我猜想旧形式在某个时候被弃用了,因为在对该代码的众多重写之一中,已经删除了对某些平台(如 Windows)的支持。请注意,即使在首次引入时,短模块名称版本也会首先列出 - 这意味着它已经是首选变体。

Edit2:我搜索了 1994 年以来的邮件列表/新闻组,看看这个变化是否在某个地方讨论过 - 看起来不像,Guido van Rossum 似乎在没有告诉任何人的情况下实现了它.

关于Python 共享对象模块命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6319379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com