[erfolglos] kaa-imlib2 unter Python 3

  • [Ausgelagert aus Wie sage ich es in Python ? (Einsteigerfragen)]

    SVG-Grafik scalieren

    Gibt es eine Funktion, die in X- und in Y-Richtung mit verschiedenen Werten Skalieren kann? :helpnew:

    Vom newtron-radio kenne ich Funktion imlib2.open_from_memory aus dem Modul kaa. Leider wird kaa schon lange nicht mehr gepflegt und veloci hat es aus Sourcen übersetzt. Mit Python3 geht das nicht mehr.

    Gruß, kle

    Einmal editiert, zuletzt von Linus (27. November 2018 um 18:12)

  • Bei SVG sollte das Attribut transform="scale(x,y)" das koennen.

    Danke. ;)

    und 2 neue Fragen:

    1) Auf github fand ich svgutils. Wie passen dessen Klassen (z.b: FigureElement) zum nanosvg?

    2.) Was ändere ich, damit kaa-imlib2 unter Python3 läuft.

    Ich bin mir der Anmaßung bewußt, als python-Anfänger solches zu erwägen

    Hier ein Ausschnitt der Anleitung von veloci für Python2

    Code
    git clone git://github.com/freevo/kaa-base.git
    git clone git://github.com/freevo/kaa-imlib2.git
    cd kaa-base
    sudo python setup.py install
    cd ../kaa-imlib2
    sudo python setup.py install

    die fehlenden Variablen Definitionen damit der C-Kompiler durchläuft, sind nicht das Problem.

    Ich hänge bei der unterschiedlichen Syntax der Python-Schittstelle (python2 <-> python3)

    Hier das kaa-imlib2/setup.py

    Hier das kaa-imlib2/src/image.py ich brauche (im newtron-radio) nur imlib2.open_from_memory

    bitte um einen Anstoß in die richtige Richtung, kle :helpnew:

  • 1. Versuch mit imlib2

    Code
    pi@raspberrypi5:~/kaa-base $ cd ../kaa-imlib2
    pi@raspberrypi5:~/kaa-imlib2 $ sudo python3 setup.py install
      File "setup.py", line 49
        print 'kaa.base not installed'
                                     ^
    SyntaxError: Missing parentheses in call to 'print'
    pi@raspberrypi5:~/kaa-imlib2 $ vi setup.py

    in kaa-imlib2/setup.py sind python2-print statements enthalten, also ohne runde Klammern. Das habe ich korrigiert für den 2. Versuch.

    Code
    pi@raspberrypi5:~/kaa-imlib2 $ sudo python3 setup.py install
    Imlib2 >= 1.2.1 not found
    Download from http://enlightenment.freedesktop.org/

    Edit: da ist imho ein Fehler aufgetreten. setup.py Zeile 60..63

    Edit: Zeile 60: if not imlib2so.check_library('imlib2', '1.2.1'):

    Edit2: Nebenbei existiert http://enlightenment.freedesktop.org/ nicht mehr

    Python
    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ sudo python3 newtron-radio-v2.7.5-mig.py &
    [1] 738
    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ Traceback (most recent call last):
      File "newtron-radio-v2.7.5-mig.py", line 11, in <module>
        from kaa import imlib2
    ImportError: cannot import name 'imlib2'

    3 Mal editiert, zuletzt von kle (26. November 2018 um 18:53) aus folgendem Grund: edit: setup zeile 60..63 und Download-Adresse existiert nicht mehr

  • Manul da hast Du recht.

    Weil ich pynanosvg verwendet hatte, habe ich folgendes ausgelassen:

    Code
    sudo apt-get install libimlib2-dev
    sudo apt-get install librsvg2-dev

    Das habe ich nachgeholt.

    Jetzt kommen Fehler, die ich kenne:

    zuerst fehlt die Definition von DL_EXPORT

    Edit: 1. Fehler ist error: 'PyBuffer_Type' undeclared

    Für den fehlenden DL_EXPORT hatte ich was im Internet gefunden, war mir aber nicht sicher. Weil schon das setup.py nicht python3-kompatibel war, nahm ich an, daß das keiner mehr ausprobiert hat.

    Danke, kle

    Edit2

    Code: src/imlib2.c
        if (!PyArg_ParseTuple(args, "O!", &PyBuffer_Type, &buffer))
            return NULL;

    in der Doku heißt es Old-style buffer objects und:

    PyBuffer_Type

    PyTypeObject PyBuffer_Type

    The instance of PyTypeObject which represents the Python buffer type; it is the same object as buffer and types.BufferType in the Python layer.

    und jetzt bin ich ratlos. Offensichtlich kennt Python3 die Old-style Declaration nicht. Soll ich diese Declaration includieren. Oder gibt es eine New-style-Variante (etwa: PyBuffer struct). Wie müßte ich src/imlib2.c ändern?

    2 Mal editiert, zuletzt von kle (26. November 2018 um 20:07)

  • Was habe ich geändert:

    kaa-imlib2/setup.py

    Diese Datei enthält mehrere print statements ohne runde Klammern um die Argumente.

    kaa-imlib2/src/imlib2.c

    (1) Fehler: src/imlib2.c:201:40: error: ‘PyBuffer_Type’ undeclared

    Info für Declaration.

    PyTypeObject PyBuffer_Type; /* kle 26.11.2018 */

    (2) Fehler: src/imlib2.c:328:1: warning: return type defaults to ‘int’ [-Wimplicit-int]

    DL_EXPORT (void)

    Info für Declaration.

    kaa-imlib2/src/image.c

    (1) src/image.c:690:58: error: ‘Py_END_OF_BUFFER’ undeclared

    Info für Declaration

    int Py_END_OF_BUFFER; /* kle 26.11.2018 */

    (2) src/image.c:723:40: error: ‘PyBuffer_Type’ undeclared

    Info für Declaration

    PyTypeObject PyBuffer_Type; /* kle 26.11.2018 */

    Achtung: im Folgenden liegen die ausgegebenen Pfade im Systembereich,
    ------------- die editierbare Quelle liegt wieder unter kaa-imlib2/src/.

    kaa-imlib2/src/image.py

    (1) File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 58

    except IOError, exc:

    Info: alte Syntax

    except (IOError, exc): # kle 27.11.2018 (runde Klammern)

    except IOError as exc: # kle 27.11.2018 (as)

    (2) File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 300

    def get_max_rectangle_size((w, h), (max_w, max_h)):

    ___________________________^

    SyntaxError: invalid syntax

    Info: ???

    <Korrektur>

    der 2. Fehler kommt oft vor in Datei src/image.py.

    Python3 mag diese Syntax nicht:

    def get_max_rectangle_size((w, h), (max_w, max_h)):

    Ich möchte sowenig wie möglich ändern. :helpnew:

    • Deshalb frage ich, ob es "etwas" gibt, damit Python3 die Syntax akzeptiert.
    • Kann ich so ändern, daß es in Python2 und in Python3 läuft

    Schönen Gruß, kle

    Einmal editiert, zuletzt von kle (27. November 2018 um 17:07)

  • Hi kle,

    toll, wie du dich da reinhängst! Mit Anfängerfragen hat das IMHO schon nichts mehr zu tun. ;)

    der 2. Fehler kommt oft vor in Datei src/image.py.

    Python3 mag diese Syntax nicht:

    def get_max_rectangle_size((w, h), (max_w, max_h)):

    Dazu folgende StackOverflow-Frage samt Antwort(en): https://stackoverflow.com/questions/2003…s-in-a-function

    Deshalb frage ich, ob es "etwas" gibt, damit Python3 die Syntax akzeptiert.

    Nein.

    Kann ich so ändern, daß es in Python2 und in Python3 läuft

    Ja!

    Code
    def get_max_rectangle_size(size, max_size):
        w, h = size
        max_w, max_h = max_size
        ... Restliche Funktion ...

    Das macht im Endeffekt das gleiche wie die alten Tuple-Parameter.

  • Hi Linus

    def get_max_rectangle_size(size, max_size):
    w, h = size
    max_w, max_h = max_size
    ... Restliche Funktion ...

    so hatte ich es schon mal gemacht. Damit muß ich die Parameter ändern und die Inline-Doku der Funktion. und das überall wo die alten Tupeln auftauchen...

    In fremden Code greife ich am liebsten minimalst ein.

    Hilf mir bitte bei der Inline-Doku-Syntax:

    Schönen Gruß, kle

  • Damit muß ich die Parameter ändern und die Inline-Doku der Funktion.

    Das musst du gar nicht!

    Für den Python-Interpreter sind das gewöhnliche Docstrings, das besondere Format dient nur der automatischen Generierung von Dokumentation durch den ursprünglichen Autor des Codes, etwa mit sphinx (http://www.sphinx-doc.org/en/master/). Da ich aber davon ausgehe, dass es dir nur darum geht, den Code wieder zum laufen zu bekommen, und nicht auch noch die Doku parallel dazu auf dem neusten Stand zu halten, kannst du die Docstrings einfach ignorieren oder entfernen.

    In fremden Code greife ich am liebsten minimalst ein.

    Hast du eigentlich schon eine automatische Konvertierung mit 2to3 versucht? https://docs.python.org/3.7/library/2to3.html

  • Hi Linus

    was ist denn _Imlib2? Ich will doch gerade kaa imlib2 importieren?

    Wo muß ich suchen? :helpnew:

    Schönen Gruß, kle

  • was ist denn _Imlib2? Ich will doch gerade kaa imlib2 importieren?

    Der führende Unterstich ist eine Konvention für Module, die aus C-Code kompiliert wurden (C-Extensions). Es kann gut sein, dass kaa-imlib2/src/imlib2.c hier die Quelldatei ist. Imports sind allerdings case-sensitive, also würde ich eher import _imlib2 (kleines i) erwarten...

    Was ist die Ausgabe von:

    Code
    ls -la /usr/local/lib/python3.5/dist-packages/kaa/imlib2/

    ?

    wenn _imlib2.so existiert, versuche mal den import anzupassen.

    Edit: auf GitHub habe ich die setup-Datei gefunden: https://github.com/freevo/kaa-iml…er/setup.py#L56

    Demnach kann es ggf. auch import _Imlib2module sein, ich kenne aber die von dir verwendete setup.py Datei nicht...

    Alles nur Vermutungen, ich kenne kaa nicht...

  • Hi Linus

    ich habe das Verschieben schon erwartet. Am ursprünglichen Platz sollten nur kurze Infos gegeben werden.

    Code
    pi@raspberrypi5:~/kaa-imlib2/src $ ls -la /usr/local/lib/python3.5/dist-packages/kaa/imlib2/
    total 216
    drwxr-sr-x 3 root staff   4096 Nov 27 16:12 .
    drwxr-sr-x 5 root staff   4096 Nov 27 16:07 ..
    -rw-r--r-- 1 root staff  11221 Nov 27 16:11 font.py
    -rw-r--r-- 1 root staff  41506 Nov 27 16:11 image.py
    -rwxr-xr-x 1 root staff 142020 Nov 27 16:12 _Imlib2module.cpython-35m-arm-linux-gnueabihf.so
    -rw-r--r-- 1 root staff   1474 Nov 27 16:11 __init__.py
    drwxr-sr-x 2 root staff   4096 Nov 27 16:12 __pycache__
    -rw-r--r-- 1 root staff    165 Nov 26 19:04 version.py

    wenn _imlib2.so existiert, versuche mal den import anzupassen.

    nö aber _Imlib2module.cpython-35m-arm-linux-gnueabihf.so

    ich kenne aber die von dir verwendete setup.py Datei nicht...

    die von Dir verlinkte setup.py heißt im folgendem diff setup-2.py

    Schönen Gruß, kle

  • Hi Linus

    ich habe ~/kaa-imlib2/src/image.py geändert

    von import _Imlib2

    nach import _Imlib2module

    cd ~/kaa-imlib2; sudo python3 setup.py install

    POSIX shared memory enabled

    + svg support enabled

    running install

    running build

    running build_py

    copying src/image.py -> build/lib.linux-armv7l-3.5/kaa/imlib2

    running build_ext

    running install_lib

    copying build/lib.linux-armv7l-3.5/kaa/imlib2/image.py -> /usr/local/lib/python3.5/dist-packages/kaa/imlib2

    byte-compiling /usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py to image.cpython-35.pyc

    writing byte-compilation script '/tmp/tmp6bkjty2m.py'

    /usr/bin/python3 -O /tmp/tmp6bkjty2m.py

    removing /tmp/tmp6bkjty2m.py

    running install_egg_info

    Removing /usr/local/lib/python3.5/dist-packages/kaa_imlib2-0.3.0.egg-info

    Writing /usr/local/lib/python3.5/dist-packages/kaa_imlib2-0.3.0.egg-info

    leider wieder Traceback.

    Traceback

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ sudo python3 newtron-radio-v2.7.5-mig.py &

    [1] 1698

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ Traceback (most recent call last):

    File "newtron-radio-v2.7.5-mig.py", line 11, in <module>

    from kaa import imlib2

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/__init__.py", line 35, in <module>

    from .image import *

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 45, in <module>

    import _Imlib2module

    ImportError: No module named '_Imlib2module'

    Habe ich Dich richtig verstanden?

    Schönen Gruß, kle

  • Habe ich Dich richtig verstanden?

    Ja.

    leider wieder Traceback.

    Mein Fehler - In Python 3 hat sich beim Import von Modulen gegenüber Python 2 etwas geändert: https://stackoverflow.com/questions/3024…hon-2-7-and-3-4

    import kaa.imlib2._Imlib2module as _Imlib2 (dann musst du auch die ganzen _Imlib2.* im Code nicht umbenennen), oder from . import _Imlib2module as _Imlib2.

    Ich habe mir https://github.com/freevo/kaa-iml…er/src/image.py angeschaut, vermutlich wird der nächste Fehler bei from font import * auftauchen -> wenn import kaa.imlib2._Imlib2module as _Imlib2 klappt, klappt auch from kaa.imlib2.font import *.

    Keine Garantie, aber heute schaffen wir das schon noch :lol:

  • Hi Linus

    wir nähern uns dem Ziel. :danke_ATDE:

    Traceback mit 'import kaa.imlib2._Imlib2module as _Imlib2'

    pi@raspberrypi5:~/kaa-imlib2 $ cd /usr/local/lib/newtron-v2

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ sudo python3 newtron-radio-v2.7.5-mig.py &

    [1] 1831

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ Traceback (most recent call last):

    File "newtron-radio-v2.7.5-mig.py", line 11, in <module>

    from kaa import imlib2

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/__init__.py", line 35, in <module>

    from .image import *

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 45, in <module>

    import kaa.imlib2._Imlib2module as _Imlib2

    ImportError: /usr/local/lib/python3.5/dist-packages/kaa/imlib2/_Imlib2module.cpython-35m-arm-linux-gnueabihf.so: undefined symbol: PyString_AsString

    [1]+ Exit 1 sudo python3 newtron-radio-v2.7.5-mig.py

    Traceback mit 'from . import _Imlib2module as _Imlib2'

    pi@raspberrypi5:~/kaa-imlib2 $ cd /usr/local/lib/newtron-v2; sudo python3 newtron-radio-v2.7.5-mig.py &

    [1] 1875

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ Traceback (most recent call last):

    File "newtron-radio-v2.7.5-mig.py", line 11, in <module>

    from kaa import imlib2

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/__init__.py", line 35, in <module>

    from .image import *

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 46, in <module>

    from . import _Imlib2module as _Imlib2

    ImportError: /usr/local/lib/python3.5/dist-packages/kaa/imlib2/_Imlib2module.cpython-35m-arm-linux-gnueabihf.so: undefined symbol: PyString_AsString

    [1]+ Exit 1 sudo python3 newtron-radio-v2.7.5-mig.py

    wo muß ich PyString_AsString definieren?

    Schönen Gruß, kle

    Edit:

    ich beantworte meine Frage: in ~/kaa-imlib2/src/image.c

    nach Fehlerkorrektur, nächster Traceback.

    Traceback wegen 'undefined symbol: PyCObject_FromVoidPtr'

    pi@raspberrypi5:~/kaa-imlib2 $ cd /usr/local/lib/newtron-v2; sudo python3 newtron-radio-v2.7.5-mig.py &

    [1] 2058

    pi@raspberrypi5:/usr/local/lib/newtron-v2 $ Traceback (most recent call last):

    File "newtron-radio-v2.7.5-mig.py", line 11, in <module>

    from kaa import imlib2

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/__init__.py", line 35, in <module>

    from .image import *

    File "/usr/local/lib/python3.5/dist-packages/kaa/imlib2/image.py", line 46, in <module>

    from . import _Imlib2module as _Imlib2

    ImportError: /usr/local/lib/python3.5/dist-packages/kaa/imlib2/_Imlib2module.cpython-35m-arm-linux-gnueabihf.so: undefined symbol: PyCObject_FromVoidPtr

    Edit_2:

    PyCObject API wurde entfernt. Stattdessen soll die Capsule API benutzt werden.

    CObject replaced with Capsule

    Code
    pi@raspberrypi5: ~ $ cd ~/kaa-imlib2;grep -n PyCObject_FromVoidPtr src/*.c
    src/imlib2.c:367:    c_api = PyCObject_FromVoidPtr((void *)api_ptrs, NULL);

    wie man sieht, geht es um Datei ~/kaa-imlib2/src/imlib2.c (bei mir Zeile 367)

    Sorry Linus, da wird heute Abend nichts mehr draus, es sei denn Du weißt was geniales.

    4 Mal editiert, zuletzt von kle (27. November 2018 um 21:35) aus folgendem Grund: Edit: PyString_AsString undeclared Edit_2: PyCObject API has been removed

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!