Сборка модуля Python из кода C не удалась

1

Я читаю этот урок о том, как связать 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))
Теги:
python-3.x
language-interoperability

1 ответ

1
Лучший ответ

Сообщение об ошибке говорит:

version.replace('', '.') AttributeError: у объекта 'float' нет атрибута 'replace'

Ваш скрипт сборки говорит:

version=1.0

Очевидно, он ожидает строку, а не число с плавающей точкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню