Python C Api默默失败

问题描述 投票:0回答:1

我正在尝试为我的C应用程序创建一个Python接口,但是当我运行它时,shell会重置并且不会显示任何错误。这是我的代码:

#include <Python.h>

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

static PyObject *method_doubletuple(self, args)
    PyObject *self;
    PyObject *args;
{
    PyObject *ret = PyTuple_New(16);
    for (int c = 0; c < 16; c++) {
        PyObject *newValue = PyNumber_Multiply(PyTuple_GetItem(args, c), Py_BuildValue("%u", (int)2));
        PyTuple_SET_ITEM(ret, c, newValue);
    }
    return ret;
}

static PyMethodDef PyTestMethods[] = {
    {"system", method_doubletuple, METH_VARARGS, "Doubles the value of a tuple with 16 elements"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef pytestmodule = {
    PyModuleDef_HEAD_INIT,
    "pytest",
    "pytest",
    -1,
    PyTestMethods
};

PyMODINIT_FUNC PyInit_pytest(void) {
    return PyModule_Create(&pytestmodule);
}
C:\Users\jotje\Desktop\Chess\SampleCModule>python setup.py install
running install
running build
running build_ext
building 'pytest' extension
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -IC:\Users\jotje\AppData\Local\Programs\Python\Python36\include -IC:\Users\jotje\AppData\Local\Programs\Python\Python36\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\cppwinrt" /Tcaddarray.c /Fobuild\temp.win-amd64-3.6\Release\addarray.obj
addarray.c
addarray.c(20): warning C4113: 'PyObject *(__cdecl *)()' differs in parameter lists from 'PyCFunction'
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:C:\Users\jotje\AppData\Local\Programs\Python\Python36\libs /LIBPATH:C:\Users\jotje\AppData\Local\Programs\Python\Python36\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.16299.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.16299.0\um\x64" /EXPORT:PyInit_pytest build\temp.win-amd64-3.6\Release\addarray.obj /OUT:build\lib.win-amd64-3.6\pytest.cp36-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.6\Release\pytest.cp36-win_amd64.lib
   Creating library build\temp.win-amd64-3.6\Release\pytest.cp36-win_amd64.lib and object build\temp.win-amd64-3.6\Release\pytest.cp36-win_amd64.exp
Generating code
Finished generating code
running install_lib
copying build\lib.win-amd64-3.6\pytest.cp36-win_amd64.pyd -> C:\Users\jotje\AppData\Local\Programs\Python\Python36\Lib\site-packages
running install_egg_info
Removing C:\Users\jotje\AppData\Local\Programs\Python\Python36\Lib\site-packages\pytest-1.0.0-py3.6.egg-info
Writing C:\Users\jotje\AppData\Local\Programs\Python\Python36\Lib\site-packages\pytest-1.0.0-py3.6.egg-info

C:\Users\jotje\Desktop\Chess\SampleCModule>python
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pytest
>>> pytest.doubletuple((4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4))

C:\Users\jotje\Desktop\Chess\SampleCModule>

[如果有人知道如何获取错误消息或日志,或者指出问题的东西,也许告诉我我在做错什么,那会很好。

python c python-c-api
1个回答
0
投票

问题是此循环:

for (int c = 0; c < 16; c++) {
    PyObject *newValue = PyNumber_Multiply(PyTuple_GetItem(args, c), Py_BuildValue("%u", (int)2));
    PyTuple_SET_ITEM(ret, c, newValue);
}

通过调用PyTuple_GetItem(args, c),您正在使用提供给函数的第c个参数,但是您仅提供了一个参数。包含浮点数的元组。您可能打算这样做:

PyObject *input = PyTuple_GetItem(args, 0); 
for (int c = 0; c < 16; c++) {
    PyObject *newValue = PyNumber_Multiply(PyTuple_GetItem(input, c), Py_BuildValue("%u", (int)2));
    PyTuple_SET_ITEM(ret, c, newValue);
}
© www.soinside.com 2019 - 2024. All rights reserved.