ImportError, ValueError, und noch mehr Ärger mit Cython

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
albertus
User
Beiträge: 52
Registriert: Mittwoch 7. Juli 2010, 14:48

Dienstag 5. April 2016, 08:53

Guten Morgen,

seit 2 Tagen versuche ich der Cython-Fehlermeldung:

Code: Alles auswählen

ValueError: hermelin.app.ng_huc.htrees.Ngram has the wrong size, try recompiling
auf den Grund zu gehen. Die erste Maßnahme bei dieser Fehlermeldung ist alle alten *.so, *.c, das build und das __pycache__ Verzeichnis zu löschen. All das wurde mit vielen anderen Versuchen schon 2**20 mal gemacht ohne Erfolg :( .

Um den obigen Fehler einzugrenzen habe ich folgendes Test-Projekt geschrieben:
node.pxd

Code: Alles auswählen

cdef class Node:
    cdef public str name
    cdef public Node left
    cdef public Node right
node.pyx

Code: Alles auswählen

cdef class Node:
    def __init__(self, name):
        self.name = name
work.pyx

Code: Alles auswählen

cimport node
from node cimport Node

cpdef Node test():
    obj = Node("foo")
    obj.left = Node("bar")
    obj.right = Node("egg")
    return obj
setup.py

Code: Alles auswählen

"""
Eine einfache Setup-Datei
"""

__revision__ = 0.1

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize

ext_modules=[
             Extension(
                       "work",
                       sources=["node.pyx", "work.pyx"],
                      )
]
setup(
  name = "work",
  ext_modules = cythonize(ext_modules)
)
test.py

Code: Alles auswählen

#!/usr/bin/env python3


import work

print(work.test())
Wenn ich die setup.py starte wird alles ohne Fehler und Warnungen kompiliert. Führe ich jetzt ./test.py aus erhalte ich folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "<frozen importlib._bootstrap>", line 2218, in _find_and_load_unlocked
AttributeError: 'module' object has no attribute '__path__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./test.py", line 4, in <module>
    import work
  File "/home/albert/test/test.py", line 4, in <module>
    import work
  File "test/node.pxd", line 1, in init test.work (work.c:906)
    cdef class Node:
ImportError: No module named 'test.node'; 'test' is not a package
Ich arbeite mit Python 3.4.2 und Cython in der Version 0.23.4.

Wo liegt hier mein Denkfehler! Freue mich über jede Hilfe und bedanke mich schon mal im Voraus.

Update: Entschuldigung habe vergessen zu erwähnen das ich die setup.py mit folgendem Befehl starte:

Code: Alles auswählen

./setup.py build_ext --inplace
Mit freundlichen Grüßen

Albertus
BlackJack

Sonntag 24. April 2016, 11:35

@albertus: So vom schnellen drüberschauen hast Du Quelltext für zwei Erweiterungsmodule `node` und `work`, in der `setup.py` lässt Du aber nur das `work`-Modul erstellen. Und da fehlt dann zur Laufzeit das `node`-Modul. Was die Ausnahme ja auch irgendwie sagt.
Antworten