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

    Edited once, last by Linus ().

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

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

  • 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

    Code
    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'

    Edited 3 times, last by kle: 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:

    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?

    Edited 2 times, last by kle ().

  • Was habe ich geändert:

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

    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

    Edited once, last by kle ().

  • 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/ques…fine-tuples-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-…/blob/master/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

    leider wieder Traceback.

    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/ques…etween-python-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-…/blob/master/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:

    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.

    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.

    Edited 4 times, last by kle: Edit: PyString_AsString undeclared Edit_2: PyCObject API has been removed ().