Я читаю этот урок о том, как связать Python и C.
Я использую Python v3.7.1, поэтому мне пришлось использовать новый интерфейс Python (отличный от примера), так что теперь у меня есть:
adder.c
#include <Python.h>
static PyObject *addList_add(PyObject *self, PyObject *args)
{
PyObject *listObj;
if (!PyArg_ParseTuple(args, "O", &listObj))
return NULL;
Py_ssize_t length = PyList_Size(listObj);
long i, sum = 0;
for (i = 0; i < length; i++)
{
PyObject *temp = PyList_GetItem(listObj, i);
long elem = PyLong_AsLong(temp);
sum += elem;
}
return Py_BuildValue("i", sum);
}
static char addList_docs[] = "add(): add all elements of the list\n";
static PyMethodDef addLust_funcs[] = {
{"add", (PyCFunction)addList_add, METH_VARARGS, addList_docs},
{NULL, NULL, 0, NULL}};
static struct PyModuleDef addList = {
PyModuleDef_HEAD_INIT,
"addList",
addList_docs,
-1,
addLust_funcs};
PyMODINIT_FUNC PyInit_addList(void)
{
return PyModule_Create(&addList);
}
Кажется, что все правильно, я могу запустить код Python, вызвав функцию addList.add()
. Но при сборке модуля я получаю следующий вывод (обратите внимание, что я могу нормально выполнить код Python после этой ошибки):
$ python setup.py install
запуск установки
бегущая сборка
работает build_ext
работает install_lib
работает install_egg_info
Traceback (последний вызов был последним):
Файл "setup.py", строка 4, в
ext_modules = [Extension ('addList', ['adder.c'])])
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ core.py", строка 148, в настройке
dist.run_commands ()
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ dist.py", строка 966, в run_commands
self.run_command (CMD)
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ dist.py", строка 985, в run_command
cmd_obj.run ()
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ command \ install.py", строка 557, в работе
self.run_command (cmd_name)
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ cmd.py", строка 313, в run_command
self.distribution.run_command (команда)
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ dist.py", строка 984, в run_command
cmd_obj.ensure_finalized ()
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ cmd.py", строка 107, в sure_finalized
self.finalize_options ()
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ command \ install_egg_info.py", строка 26, в finalize_options
to_filename (safe_version (self.distribution.get_version ())),
Файл "C: \ Users \ x \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ distutils \ command \ install_egg_info.py", строка 68, в safe_version
version = version.replace ('', '.')
AttributeError: у объекта 'float' нет атрибута 'replace'
setup.py
from distutils.core import setup, Extension
setup(name='addList', version=1.0,
ext_modules=[Extension('addList', ['adder.c'])])
main.py
import addList
l = [1, 2, 3, 5, 4]
print(addList.add(l))