Как бороться с Cython ValueError - PullRequest
5 голосов
/ 01 августа 2011

Я довольно новичок в типах расширений Cython и озадачен следующим связанным с Cython ValueError, который выдается во время выполнения:

ValueError: vrptwms.node.Node has the wrong size, try recompiling

Класс Node определен в файлах node.pxd и node.pyx в каталоге vrptwms. Содержание первого

cdef class Node:
    """
    docstring
    """
    cdef public float x, y, demand
    cdef public float earliest_start, latest_start, servicetime
    cdef public int id

и последний из них (я временно удалил все объявления типов в надежде отследить проблему)

cdef class Node:
    """
    Represents either a customer or the depot.
    """
    # pylint: disable-msg=C0103, R0913

    def __init__(self,
                id_,
                x,
                y,
                demand,
                earliest_start,
                latest_start,
                servicetime):
        """
        docstring
        """
        self.x = float(x)
        self.y = float(y)
        self.demand = float(demand)
        self.earliest_start = float(earliest_start)
        self.latest_start = float(latest_start)
        self.servicetime = float(servicetime)
        self.id = int(id_)

    # some internal functions

Затем класс узла включается в третий файл problemreader.pyx следующим образом:

from vrptwms.node cimport Node
from vrptwms.node import Node

Компиляция работает без проблем. setup.py содержит

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("route", ["fastroute.pyx"]),
            Extension("node", ["node.pyx", "node.pxd"]),
            Extension("problemreader", ["problemreader.pyx"]),
            ]

setup(
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
)

Я также безуспешно пытался добавить node.pxd в расширение для чтения проблем. Проблема возникает в следующем сгенерированном коде C

  __pyx_ptype_7vrptwms_4node_Node = __Pyx_ImportType("vrptwms.node", "Node", sizeof(struct __pyx_obj_7vrptwms_4node_Node), 1); if (unlikely(!__pyx_ptype_7vrptwms_4node_Node)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

и причины

Traceback (most recent call last):
  File "./cli.py", line 16, in <module>
    from vrptwms.problemreader import ProblemReader
  File "node.pxd", line 9, in init problemreader (problemreader.c:4991)
    cdef class Node:
ValueError: vrptwms.node.Node has the wrong size, try recompiling

Я удалял все сгенерированные файлы .c, .so и .o несколько раз, но не смог избавиться от проблемы. Будем очень благодарны за любые подсказки (включая ссылки на документацию, которые я мог пропустить).

Редактировать: проблема не воспроизводится, если я использую относительный импорт старого стиля (например, узел импорта вместо vrptwms.node) и удаляю файл init .py - так что нет ничего плохого в самом источнике. Я создал крошечный тестовый сценарий, воспроизводящий проблему: c_test.tar.gz (необходимо извлечь в каталог на PYTHONPATH) и почти идентичный случай без использования пакета, который не воспроизводит это: c_test_w.tar.gz .

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

Роберт Брэдшоу предложил несколько советов для списка рассылки cython-users . Суть в том, что ручная (повторная) компиляция файлов .pyx с cython *.pyx и запуск оригинального сценария установки работает. Существует также более новый способ написания сценария установки, описанный в CEP 201 - Предварительная обработка Distutils , который должен помочь, но не работает в моей текущей установке с Cython 0.14.1.

0 голосов
/ 01 августа 2011

Я не понимаю, что вы здесь делаете:

from vrptwms.node cimport Node
from vrptwms.node import Node

Когда вы дважды импортируете одно и то же имя, второй импорт переопределяет первый.

...