Python3 c api - python 停止工作

Python3 c api - python stops working

我试图获取一个列表作为输入。我也用谷歌搜索过。 我在命令提示符下构建并安装了我的 C 扩展模块。我能够导入该模块,但它确实显示了很少 warnings.What 它向我展示了......

在 CMD

D:\Python\c\summa>py setup.py build
running build
running build_ext
building 'saiyanism' extension
C:\Program Files\Microsoft Visual Studio17\Community\VC\Tools\MSVC.13.2612
8\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IE:\python\include
 -IE:\python\include "-IC:\Program Files\Microsoft Visual Studio17\Community\
VC\Tools\MSVC.13.26128\include" "-IC:\Program Files\Windows Kits\NETFXSDK.6
.1\include\um" "-IC:\Program Files\Windows Kits\include.0.16299.0\ucrt" "-
IC:\Program Files\Windows Kits\include.0.16299.0\shared" "-IC:\Program Fil
es\Windows Kits\include.0.16299.0\um" "-IC:\Program Files\Windows Kits\
include.0.16299.0\winrt" "-IC:\Program Files\Windows Kits\include.0.162
99.0\cppwinrt" /TcH.c /Fobuild\temp.win32-3.6\Release\H.obj
H.c
H.c(63): warning C4133: 'function': incompatible types - from 'PyObject *' to 'c
onst char *const '
H.c(117): warning C4113: 'PyObject *(__cdecl *)(PyObject *)' differs in paramete
r lists from 'PyCFunction'
C:\Program Files\Microsoft Visual Studio17\Community\VC\Tools\MSVC.13.2612
8\bin\HostX86\x86\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID
=2 /MANIFESTUAC:NO /LIBPATH:E:\python\libs /LIBPATH:E:\python\PCbuild\win32 "/LI
BPATH:C:\Program Files\Microsoft Visual Studio17\Community\VC\Tools\MSVC.1
3.26128\lib\x86" "/LIBPATH:C:\Program Files\Windows Kits\NETFXSDK.6.1\lib\um\x
86" "/LIBPATH:C:\Program Files\Windows Kits\lib.0.16299.0\ucrt\x86" "/LIBP
ATH:C:\Program Files\Windows Kits\lib.0.16299.0\um\x86" /EXPORT:PyInit_sai
yanism build\temp.win32-3.6\Release\H.obj /OUT:build\lib.win32-3.6\saiyanism.cp3
6-win32.pyd /IMPLIB:build\temp.win32-3.6\Release\saiyanism.cp36-win32.lib
   Creating library build\temp.win32-3.6\Release\saiyanism.cp36-win32.lib and ob
ject build\temp.win32-3.6\Release\saiyanism.cp36-win32.exp
Generating code
d:\python\c\summa\h.c(112) : warning C4715: 'sumlist': not all control paths ret
urn a value
Finished generating code

D:\Python\c\summa>

这是我的 c 模块....

H.c

#include "Python.h"
static PyObject* saiyanism(PyObject* self,PyObject* args)
    {
    const char* saiyajin;
    if(!(PyArg_ParseTuple(args,"s",&saiyajin))) return NULL;
    printf("Hello,%s.Glad to see a saiyan.\n",saiyajin);
    Py_RETURN_NONE;

    }
static PyObject* UI(PyObject* self)  //,PyObject* args)
{/*code here works properly*/
Py_RETURN_NONE;
}

static PyObject* set_all(PyObject* self,PyObject *target)//PyLong_FromLong(PyObject *item))
{
    /*some code and this too works*/
    Py_RETURN_NONE;
}

static PyObject* sumlist(PyObject* self,PyObject *args)
{
PyObject *pList;
PyObject *pItem;
Py_ssize_t n;
int i;

if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &pList)) {
    PyErr_SetString(PyExc_TypeError, "parameter must be a list.");
    return NULL;
}

n = PyList_Size(pList);

for (i=0; i<n; i++) {
    pItem = PyList_GetItem(pList, i);
    if(!PyLong_Check(pItem)) {
        PyErr_SetString(PyExc_TypeError, "list items must be integers.");
        printf("%ld",PyLong_AsLong(pItem));
        Py_RETURN_NONE;
    }
}
}

static PyMethodDef sups[]=
{
    {"saiyanism",saiyanism,METH_VARARGS,""},
    {"UI",UI,METH_NOARGS,""},
    {"set_all",set_all,METH_VARARGS,""},
    {"sumlist",sumlist,METH_VARARGS,""},
    {NULL,NULL,0,NULL}
};

static struct PyModuleDef saiyanismdef={
    PyModuleDef_HEAD_INIT,
    "saiyanism",
    "sad",
    -1,
    sups
};

PyMODINIT_FUNC PyInit_saiyanism(void){
Py_Initialize();
return PyModule_Create(&saiyanismdef);
}

问题是

当我尝试导入并 运行 我的 sumlist 函数时 python 列表作为参数 Python 立即停止。

这是image

刚开始学这个,如果我的程序有错误请指出。

我应该以不同的方式通过争论吗?我哪里错了?

我在sumlist中至少可以看到两个错误:

  1. 代码中

    if(!PyLong_Check(pItem)) {
        PyErr_SetString(PyExc_TypeError, "list items must be integers.");
        printf("%ld",PyLong_AsLong(pItem));
        Py_RETURN_NONE;
    }
    

    你 return None(Python 对象)而不是 C NULL 指针,后者用于发出错误信号。您还尝试使用 PyLong_AsLong 打印 pItem - 您对 pItem 了解的一件事是 它不是 long !

  2. (导致您出现问题的主要错误)当您没有任何错误地到达 sumlist 结尾时会发生什么?你什么都不 return,Python 期待你 return 一个 PyObject*。这就是警告告诉您的内容:

    warning C4715: 'sumlist': not all control paths return a value

    此处的快速修复是将 Py_RETURN_NONE 添加到 return 函数的末尾,将 None 对象添加到 Python。但是,您可能想做一些更有用的事情....