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
中至少可以看到两个错误:
代码中
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
!
(导致您出现问题的主要错误)当您没有任何错误地到达 sumlist
结尾时会发生什么?你什么都不 return,Python 期待你 return 一个 PyObject*
。这就是警告告诉您的内容:
warning C4715: 'sumlist': not all control paths return a value
此处的快速修复是将 Py_RETURN_NONE
添加到 return 函数的末尾,将 None
对象添加到 Python。但是,您可能想做一些更有用的事情....
我试图获取一个列表作为输入。我也用谷歌搜索过。 我在命令提示符下构建并安装了我的 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
中至少可以看到两个错误:
代码中
if(!PyLong_Check(pItem)) { PyErr_SetString(PyExc_TypeError, "list items must be integers."); printf("%ld",PyLong_AsLong(pItem)); Py_RETURN_NONE; }
你 return
None
(Python 对象)而不是 CNULL
指针,后者用于发出错误信号。您还尝试使用PyLong_AsLong
打印pItem
- 您对pItem
了解的一件事是 它不是long
!(导致您出现问题的主要错误)当您没有任何错误地到达
sumlist
结尾时会发生什么?你什么都不 return,Python 期待你 return 一个PyObject*
。这就是警告告诉您的内容:warning C4715: 'sumlist': not all control paths return a value
此处的快速修复是将
Py_RETURN_NONE
添加到 return 函数的末尾,将None
对象添加到 Python。但是,您可能想做一些更有用的事情....