Python共享对象模块命名约定

2024-10-01 11:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我在C++中编写了一个Python模块,并将其作为一个共享对象库构建,并且运行良好。但是在解决所有这些问题时,我注意到(通过strace)Python寻找一些不同的变体import被调用。特别是,当我说import foo时,Python按顺序搜索:

  • foo(目录)
  • 在福索在
  • 在食品模块.so在
  • 在食品在
  • 在食品工业公司在

这一切都是可以理解的除了食品模块.so. 为什么Python会把这两者都看作姓名以及模块名称那么?是历史文物吗?我搜索了很多,却没有得到任何解释,我想知道是否应该命名我的模块食品模块.so而不是福索. 我的系统似乎有一些遵循每个约定的现有Python模块,因此我不禁想知道不同的名称是否意味着什么。在


Tags: 模块对象import目录名称食品sofoo
2条回答

这实际上是平台相关的,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和{}。后者比较容易,它被定义为同一个文件中的[".py", ".pyw", ".pyc"](第二个条目只在Windows上出现)。_PyImport_DynLoadFiletab在各种dynload_<platform>.c文件中定义。在基于Unix的系统上,它的值是[".so", "module.so"],对于CygWin,它定义了[".dll", "module.dll"],而对于OS/2,它的值是{},对于Windows,它只是[".pyd"]。在

我查看了源代码历史,最终得出了1999年的更改,它显然增加了“模块.so“作为可能的后缀:http://hg.python.org/cpython-fullhistory/diff/8efa37a770c6/Python/importdl.c。因此,这些更改最初是为NeXTStep(最终成为macosx)添加的,只针对特定的链接设置。我不知道这个操作系统,所以很难说为什么这么做-我怀疑这只是为了防止命名冲突。E、 g.框架库foo.so可能已经加载,操作系统不允许加载同名的另一个库。尽管如此,{/cda}允许Python{/cda}存在

编辑:上面的段落是错误的-我没有追溯到足够远的历史,多亏了senderle的指出。事实上,有趣的变化似乎是1994年以来的http://hg.python.org/cpython-fullhistory/diff/2230/Python/import.c,在那里添加了一个新的模块命名方案(foo.so),作为旧方案(foomodule.so)的替代方案。我想旧的表单在某个时候会被弃用,因为对它的支持已经在某些平台上被删除了,比如Windows,在对该代码的大量重写中。请注意,即使在第一次引入时,简短的模块名版本也被列在第一位,这意味着它已经是首选的变体。在

Edit2:我搜索了1994年的邮件列表/新闻组,看看是否有人讨论过这一变化——它看起来不像,Guido van Rossum似乎没有告诉任何人就实现了它。在

这只是一个猜测,但我只能假设这与下面的有关,来自Extending Python with C or C++。在

Begin by creating a file spammodule.c. (Historically, if a module is called spam, the C file containing its implementation is called spammodule.c; if the module name is very long, like spammify, the module name can be just spammify.c.)

我想这个约定扩展到.so文件的名称。这一推测得到the same第1.5节的进一步支持。在


基于Wladimir的excellent discovery,我找到了first reference到{}作为后缀。它来自于一个支持SunOS库动态加载的补丁,来自“Bill”。(Bill Jansson?)显然,module-as后缀约定是在使用.so共享库之前开始的,当{}库被采用时,该约定被简单地维护了。在

我认为Wladimir是对的,尽管有趣的变化是采用了短模块名约定。这证实了我的猜测,长模块名是早期的约定。在

相关问题 更多 >