簡體   English   中英

編譯器找不到Py_InitModule()..它是否已被棄用,如果是這樣,我應該使用什么?

[英]Compiler can't find Py_InitModule() .. is it deprecated and if so what should I use?

我正在嘗試為python編寫C擴展。 使用代碼(如下)我得到編譯器警告:

implicit declaration of function ‘Py_InitModule’

它在運行時失敗並出現此錯誤:

undefined symbol: Py_InitModule

我花了幾個小時尋找一個沒有快樂的解決方案。 我嘗試過多次語法修改,我甚至發現一篇帖子暗示該方法已被棄用。 但是我發現沒有替代品。

這是代碼:

#include <Python.h>

//a func to calc fib numbers
int cFib(int n)
{
    if (n<2) return n;
    return cFib(n-1) + cFib(n-2);
}


static PyObject* fib(PyObject* self,PyObject* args)
{
    int n;
    if (!PyArg_ParseTuple(args,"i",&n)) 
        return NULL;    
    return Py_BuildValue("i",cFib(n));
}

static PyMethodDef module_methods[] = {
    {"fib",(PyCFunction) fib, METH_VARARGS,"calculates the fibonachi number"},
    {NULL,NULL,0,NULL}
};

PyMODINIT_FUNC initcModPyDem(void)
{
    Py_InitModule("cModPyDem",module_methods,"a module");
}

如果它有幫助,這是我的setup.py:

from distutils.core import setup, Extension

module = Extension('cModPyDem', sources=['cModPyDem.c'])
setup(name = 'packagename', 
    version='1.0',
    description = 'a test package',
    ext_modules = [module])

和test.py中的測試代碼:

import cModPyDem

if __name__ == '__main__' :

    print(cModPyDem.fib(200))

任何幫助都會非常感激。

您擁有的代碼在Python 2.x中可以正常工作,但Python 3.x中不再使用Py_InitModule 現在,您創建一個PyModuleDef結構,然后PyModule_Create它的引用傳遞給PyModule_Create

結構看起來像:

static struct PyModuleDef cModPyDem =
{
    PyModuleDef_HEAD_INIT,
    "cModPyDem", /* name of module */
    "",          /* module documentation, may be NULL */
    -1,          /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
    module_methods
};

然后你的PyMODINIT_FUNC函數看起來像:

PyMODINIT_FUNC PyInit_cModPyDem(void)
{
    return PyModule_Create(&cModPyDem);
}

請注意, PyMODINIT_FUNC函數的名稱必須是PyInit_<name>的形式,其中<name>是模塊的名稱。

我認為如果你閱讀Python 3.x文檔中的擴展是值得的。 它詳細描述了如何在現代Python中構建擴展模塊。

我遇到了與Py_InitModule()相同的問題。 我從前面提到的Python 3文檔開始,特別是“擴展和嵌入Python解釋器”文檔。 但該文檔的標題為“簡單示例”的章節中遺漏了細節。 所以。 我用谷歌搜索了這篇簡短的講座:

http://www.scipy-lectures.org/advanced/interfacing_with_c/interfacing_with_c.html

這在很多方面更適合Python-C API擴展的新手...除了它沒有為Python v3更新。 所以...請參閱scipy講座,Python 3文檔和StackOverflow討論,根據您的需求剔除每個相關信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM