Я читаю этот урок о том, как связать 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, запуск 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, в run 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_final Файл ized() "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))
Сообщение об ошибке говорит:
version.replace('', '.') AttributeError: у объекта 'float' нет атрибута 'replace'
Ваш скрипт сборки говорит:
version=1.0
Очевидно, он ожидает строку, а не число с плавающей точкой.