我在C++中编写了一个Python模块,并将其作为一个共享对象库构建,并且运行良好。但是在解决所有这些问题时,我注意到(通过strace)Python寻找一些不同的变体import
被调用。特别是,当我说import foo
时,Python按顺序搜索:
这一切都是可以理解的除了食品模块.so. 为什么Python会把这两者都看作姓名以及模块名称那么?是历史文物吗?我搜索了很多,却没有得到任何解释,我想知道是否应该命名我的模块食品模块.so而不是福索. 我的系统似乎有一些遵循每个约定的现有Python模块,因此我不禁想知道不同的名称是否意味着什么。在
这实际上是平台相关的,Python有不同的后缀,它根据操作系统来尝试。下面是
import.c
中后缀表的初始化:所以它连接两个列表,}。后者比较容易,它被定义为同一个文件中的},对于Windows,它只是
_PyImport_DynLoadFiletab
和{[".py", ".pyw", ".pyc"]
(第二个条目只在Windows上出现)。_PyImport_DynLoadFiletab
在各种dynload_<platform>.c
文件中定义。在基于Unix的系统上,它的值是[".so", "module.so"]
,对于CygWin,它定义了[".dll", "module.dll"]
,而对于OS/2,它的值是{[".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++。在
我想这个约定扩展到
.so
文件的名称。这一推测得到the same第1.5节的进一步支持。在基于Wladimir的excellent discovery,我找到了first reference到{}作为后缀。它来自于一个支持SunOS库动态加载的补丁,来自“Bill”。(Bill Jansson?)显然,}库被采用时,该约定被简单地维护了。在
module
-as后缀约定是在使用.so
共享库之前开始的,当{我认为Wladimir是对的,尽管有趣的变化是采用了短模块名约定。这证实了我的猜测,长模块名是早期的约定。在
相关问题 更多 >
编程相关推荐