PyMODINIT_FUNC和PyModule_Create之间的区别

时间:2012-05-09 03:18:35

标签: python python-3.x python-c-extension

如果我理解正确,

  1. Python 2.X中的PyMODINIT_FUNC已被Python3.X中的PyModule_Create取代
  2. 两者都返回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);
    }
    
  3. 所以,我的理智检查问题是:

    • 我的理解是否正确?
    • 为什么要做出这种改变?

    现在,我只是在尝试非常简单的Python C扩展案例。也许如果我做得更多,那么答案就很明显,或者可能是因为我试图将Python嵌入其他东西......

1 个答案:

答案 0 :(得分:5)

  1. 是的,您的理解是正确的。必须使用返回类型PyMODINIT_FUNC从initing函数返回新模块对象。 (PyMODINIT_FUNC声明函数在python2中返回void,并在python3中返回PyObject *。)

  2. 我只能推测做出改变的人的动机,但我相信这样可以更容易地识别导入模块的错误(你可以从module-init函数返回NULL)在python3中,如果出现问题)。