PyImport_AppendInittab为什么会失败?

How can PyImport_AppendInittab fail?

本文关键字:失败 为什么 AppendInittab PyImport      更新时间:2023-10-16

根据官方文档,PyImport_AppendInittab在失败时会返回-1。但是,它没有指定为什么这个函数会失败。

我想知道它是否只会因为程序员的错误而失败(不正确的参数,没有在正确的时间被调用等),或者它是否也会因为程序员无法控制的其他因素而失败(如未安装Python)。

我问是因为我想知道我应该用断言还是异常来处理这个。此外,如果我应该用异常处理它,我是否有办法从Python API捕获指定函数调用失败原因的错误消息?

根据文档,PyImport_AppendInittab()PyImport_ExtendInittab()的方便包装,并且返回-1 "如果表不能扩展"。此外,PyImport_ExtendInittab()返回-1"如果没有足够的内存可以分配到扩展内部表"。这两个函数"都应该在Py_Initialize()之前调用"

因此,只有当程序内存不足时,这些函数才会失败。我猜当提供无效参数时,它们也可能失败,例如当试图注册与现有模块同名的内置模块时。后一种情况很容易避免,因为内置模块的名称是众所周知的。

总之,您可以假设返回值-1表示"内存不足",这应该永远不会发生,因为该函数只在进程的早期被调用(在Py_Initialize()之前),加上模块表所需的内容量相当小。

如果PyImport_AppendInittab()失败,Python不提供错误字符串。要抛出一个有意义的异常,您只需报告您此时所知道的信息:未能将模块MODULENAME添加到解释器的内置模块