Сборка модуля Python из кода C не удалась - PullRequest
0 голосов
/ 11 ноября 2018

Я читаю этот урок о том, как связать 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))

1 Ответ

0 голосов
/ 11 ноября 2018

Сообщение об ошибке гласит:

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

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

version=1.0

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

...