Wie nutzt man das neue devshell-Plugin ?

  • Quote from Reichi

    enigma2-4.3.1r24
    # For Developers
    - Add DevShell plugin - an interactive python shell for testing python code in directly inside of the enigma2 runtime (including all enigma2 Imports)
    - telnet localhost 8007


    Plugin installieren, reboot, per Telnet verbinden und man hat eine Python Shell, die innerhalb von enigma2 ausgeführt wird...

    hmm, Plugin installiert. Ist das dann irgendwo zu sehen oder nur intern?
    Beim Versuch mit Telnet zu verbinden, kommt "Connection refused".
    Ich muss dort doch den Port 8007 angeben, oder ?


    Bei der normalen Telnet-Verbindung (ohne Portangabe) merke ich keinen Unterschied.
    Sollte man da was sehen?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ich glaub, jetzt hab ich es gerafft ;)


    Man muss in der normalen Telnet-Sitzung den Befehl "telnet localhost 8007" eingeben :D


    Hab da nun mal ein paar Python-Befehle eingegeben, das klappt soweit.
    Auch alles schön bunt ;)


    Aber wie kann ich da ein Plugin programmieren/testen ?
    Oder kann man da nur kleine Code-Schnipsel austesten?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Du kannst mit der Shell direkt auf Enigma2-Objekte während der Laufzeit von Enigma2 zugreifen. :)
    Das eignet sich für schnelle Test, beispielsweise kannst Du die epgcache instance importen und auf Daten zugreifen.

  • Das klingt ja super.
    Gibt es dafür schon irgendwo Beispiel-Zeilen, wie man das konkret macht? Also das Zugreifen auf Objekte.


    Damit ließe sich doch bestimmt auch ein Plugin beenden, wenn es sich z.B. wegen eines Skin-Fehlers nicht mehr bedienen/schließen lässt. Da half ja bisher nur ein e2-restart.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Solche "spielereien" sind natürlich schon möglich da man vollen Zugriff auf das laufende enigma2 hat.
    Aber man muss e2 gut kennen um da ans Ziel zu kommen.
    Zumindest gut genug um zu Wissen wo man nachsehen muss ;)

    mfg ,
    Reichi

  • Da wäre ich doch für ein paar Code-Zeilen für die devshell dankbar, wie man dort ein laufendes Plugin (Screen) beenden kann.


    Nur mit import und .close() ging es nicht. Da wollte die devshell eine instance des screens ;)

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Glaubs mir, das geht nicht, wie Du Dir das vorstellst mit den Plugins.
    Und wenn man Trick 17 auspackt (es gibt einen Weg), dann wird das nicht sauber werden. Und den werde ich hier nicht zeigen :D

  • Ok, dann schauen wir mal, welche Nutzungsmöglichkeiten sich da für mich noch ergeben ;)


    Hatte da eben mehr an die schnelle Hilfe bei der Plugin-Programmierung gedacht, um nicht erst umständlich print-Ausgaben reinprogrammieren zu müssen, um sich den Inhalt für bestimmte Plugin-Variablen ausgeben zu lassen.


    Aber das scheint wohl auch nicht zu funktionieren.
    Zumindest bin ich da mit meinen ersten Versuchen gescheitert ;)

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Es ist eher lustig was du dann an infos zu diversen dingen wo es nur pyo gibt erfahren und dann damit tuen kannst, aber das ist Trick 20 :)

  • Im Zweifel hat man im Python auch immer Zugriff auf den kompletten Stack der ausgeführten Klassen und den Speicher (Stichwort gc). Von daher geht da... viel... :)

    so long
    m0rphU

  • Das klingt alles vielversprechend ;)
    Aber da bräuchte dann nochmal konkrete Hilfe.
    Mir helfen immer kleine Beispiele mit ein paar Zeilen ;)


    Wäre die Ausgabe von Plugin-Variablen mit wenigen Zeilen möglich?
    Wie müssten die Zeilen aussehen?


    Das ist ja schon wieder völliges Neuland ;)

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Mit wenig Zeilen geht da wohl wenig. Ich habe es gerade nur geschafft einen heftigen enigma2 Crash zu verursachen mit dem gc. Da passen gar nicht mehr alle Fehlermeldungen ins Crashlog :D

    so long
    m0rphU

  • Hatte da eben mehr an die schnelle Hilfe bei der Plugin-Programmierung gedacht

    doch natürlich geht das.
    Man kann sich die die Instanz irgendwo so ablegen dass man dran kommt.
    Wenn man mit dem entwickeln fertig ist sollte man das halt wieder entfernen.


    Ein Beispiel wäre sowas

    Python: Test.py
    class Test:
        instance = None
        def __init__(self):
            Test.instance = self
            ....


    In der DevShell dann

    Python
    from Test import Test
    print Test.instance

    Meintest du sowas?
    Also das ist kein Problem und geht jederzeit.
    Und noch ganz viele andere Dinge.

    mfg ,
    Reichi

  • du musst nur die freundliche suchmaschine nach code fragen wie man alle variablen einer python classe mit namen und value printen kannst, das sollte eigentlich zur inspiration reichen.


    Aber zum testen vom Adrenalin das eine importierte .so ist läuft das prima.


    Trick 21 ist dann wenn realisierst das du dann e2 bist und auch vollen zugriff auf alle filepointer hast die der C++ core verwaltet. Da gehen .... lustige Dinge ....

    Edited once, last by Lost in Translation ().

  • ...
    Man kann sich die die Instanz irgendwo so ablegen dass man dran kommt
    ...


    Meintest du sowas?
    ...

    Super, hat geklappt :D
    Konnte nun mit Test.instance.close() den Screen schließen.
    Auch der Zugriff auf die self-Variablen klappt damit Test.instance.VARIABLE .


    Wenn in einem Screen Variablen mit "global xxxxx" verwendet werden, wie kommt man da an den Inhalt?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP