15

如果我理解正确,

  1. PyModule_CreatePython 2.X中的 PyMODINIT_FUNC已替换为Python3.X
  2. 两者都 return PyObject*,但是,在 Python 3.X 中,模块的初始化函数必须返回PyObject*给模块 - 即

    PyMODINIT_FUNC
    PyInit_spam(void)
    {
       return PyModule_Create(&spammodule);
    }
    

    而在 Python2.X 中,这不是必需的 - 即

    PyMODINIT_FUNC
    initspam(void)
    {
      (void) Py_InitModule("spam", SpamMethods);
    }
    

所以,我的健全性检查问题是:

  • 我的理解正确吗?
  • 为什么会做出这样的改变?

现在,我只是在试验非常简单的 Python 的 C 扩展案例。也许如果我做得更多,这个问题的答案会很明显,或者如果我试图将 Python 嵌入到其他东西中......

4

1 回答 1

8
  1. 是的,你的理解是正确的。您必须从具有返回类型 PyMODINIT_FUNC 的初始化函数返回新模块对象。(PyMODINIT_FUNC 声明函数在 python2 中返回 void,在 python3 中返回 PyObject*。)

  2. 我只能推测进行更改的人的动机,但我相信这是为了更容易识别导入模块时的错误(如果出现问题,您可以从 python3 中的 module-init 函数返回 NULL )。

于 2012-05-16T20:19:08.280 回答