Eine .py via Telnet per Hand zum Compilieren anschieben...!?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Kann es sein, dass der "reload"-Befehl für Python nicht via Default in NN2 enthalten, und demnach auf irgendeine Weise erst noch installiert werden muss?
      Ich habe eben sogar mal auf NN2 v4.0.10 geupdated und neu gestartet. Da es sich immer noch so verhält (siehe voriges Posting), bleibe ich mal bei dieser Nachfrage...

      Nächste Frage (falls "Ja, Du musst den Befehl erst noch der Box beibringen"), wie mache ich das? Via apt-get, oder wie?
      "Wenn das die Lösung ist, will ich mein Problem wieder zurück"
      Gesendet mit Fernsprecher

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von chroma_key ()

    • Hi,

      der reload ist eine Python build-in-function und daher vorhanden, sonst hättest du bei deinem Test auch einen GS bekommen, wenn dieser nicht vorhanden ist und die .py wäre ja auch nicht kompiliert worden.

      Das mit dem Umbenennen der .py hast du aber falsch verstanden, das bezieht sich nur auf die plugin.py, da diese von Enigma zum Starten des Plugins benutzt wird. Man benennt daher nur die plugin.py um und erstellt eine neue plugin.py mit dem reload, aber auch mit dem Aufruf der main Funktion aus der "originalen", umbenannten plugin.py. Das sieht dann z.b. so aus:

      Quellcode

      1. # -*- coding: utf-8 -*-
      2. from Plugins.Plugin import PluginDescriptor
      3. import SPIEGELOnline
      4. def spiegelstart(session, **kwargs):
      5. reload(SPIEGELOnline)
      6. try:
      7. session.open(SPIEGELOnline.spiegelMain)
      8. except:
      9. import traceback
      10. traceback.print_exc()
      11. def Plugins(**kwargs):
      12. return [
      13. PluginDescriptor(name="SPIEGEL Online", description="SPIEGEL Online & SPIEGEL-Archiv",where = [PluginDescriptor.WHERE_PLUGINMENU], icon = "plugin.png", fnc=spiegelstart),
      14. PluginDescriptor(name="SPIEGEL Online", description="SPIEGEL Online & SPIEGEL-Archiv", where = [PluginDescriptor.WHERE_EXTENSIONSMENU], fnc=spiegelstart)
      15. ]
      Alles anzeigen

      Die neue plugin.py ersetzt die originale plugin.py (die in diesem Beispiel bei mir dann "SPIEGELOnline.py" heißt) und ruft analog zur originalen plugin.py die beim PluginDescriptor definierte main Funktion über den "qualified name".aus der umbenannten plugin.py auf: session.open(SPIEGELOnline.spiegelMain)

      Jetzt kann man beliebige Änderungen an der umbenannten plugin.py machen und bei jedem Start des Plugins wird die Datei neu kompiliert (wenn Veränderungen gemacht wurden).

      Will man nun mit einer weiteren .py eines Plugins dasselbe machen, muss man das Modul innerhalb der umbenannten plugin.py zuerst importieren und dann reloaden. Wird nicht das komplette Modul importiert, sondern nur eine Class des Moduls (from ... import ...), muss man den "from" import nach den reload nochmal ausführen:

      Quellcode

      1. def openBouquetEPG(bouquet):
      2. services = getBouquetServices(bouquet)
      3. if len(services):
      4. global epg_bouquet
      5. epg_bouquet = bouquet
      6. import GraphMultiEpg
      7. reload(GraphMultiEpg)
      8. from GraphMultiEpg import GraphMultiEPG
      9. dlg_stack.append(Session.openWithCallback(closed, GraphMultiEPG, services, zapToService, changeBouquetCB))
      10. return True
      11. return False
      Alles anzeigen



      Viel Erfolg!
      kashmir

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von kashmir ()

    • Hi,

      nochmals danke für die ausführliche Antwort. Also eine neue plugin.py muss als Loader für das eigentliche Plugin quasi "untergeschummelt" werden, die dann die plugin_org.py (umbenannte "plugin.py" des Originals) lädt, die wiederum die GraphMultiEpg.py lädt, die dann wiederum künftig nach Modifikationen auch ohne GUI-Neustarts für Änderungen editiert werden kann. Das Zwischengeschaltete übernimmt die Arbeit der imports, sowie die zwischengeschalteten reloads das partielle Re-Compilieren. OK.
      Auch wenn ich es noch nicht hinbekommen habe... keine Sorge, dass Du hier ewig Hilfe leisten musst ;)
      Sobald ich einmal ein ordentliches Beispiel habe, dass auch läuft, bekomme ich das auch mit aufwendigeren Konstrukten hin, und sofern der Mehraufwand lohnt, lohnt sich sicherlich auch Dein Trick, gegenüber ständigen GUI-Neustarts.

      Die Sache ist so:
      Die Original plugin.py, die als Hilfsloader für die Original GraphMultiEpg.py dient, ist weit aufwendiger konstruiert, als in Deinem Beispiel (vereinfacht) beschrieben. Daraus ergeben sich theoretisch mehr als 1000 Möglichkeiten, und ebenso etwaige 1000 Reboots, bis Dein Trick mit dem GraphMultiEpg-Plugin auch bei mir läuft.
      Denn leider konnte ich mir aus dem Hilfsloader-Beispiel für ein SpiegelOnline-Plugin (das Beispiel von Dir hatte ich schonmal in einem anderen Board gelesen), und einer - von Dir aus dem Gedächtnis konstruierten - Modifikation der plugin.py, die als neuer, untergeschobener Loader für das GraphMultiEpg-Plugin dient, die aber schon im Original völlig anders als in Deinem Beispiel aufgebaut ist, mir nichts Lauffähiges zusammenbrauen.

      Nach gefühlten 50 Versuchen habe ich daher erstmal abgebrochen, und erhoffe mir, dass Du mal ein Zeitfenster erwischst, bei dem Deine Regierung gerade nicht TV guckt, und Du Deinen eigenen Trick mit dem GraphMultiEpg.py selber mal durchspielst...
      Tschuldige... Ich denke, ich habe es in der Theorie verstanden, aber ich bekomme es praktisch einfach nicht zum laufen..

      Danke im Voraus und Grüße,
      chroma_key
      "Wenn das die Lösung ist, will ich mein Problem wieder zurück"
      Gesendet mit Fernsprecher

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von chroma_key ()

    • Hi,

      zuerst einmal zur Klarstellung: das Ganze ist kein "Trick" von mir, sondern eine offizielle Python Funktion. In dem obigen Link stehen alle Infos zum reload und auf stackoverflow.com gibt es auch diverse Beispiele und Diskussionen zum reload, die du dir auch mal ansehen kannst. Wie man den reload dann in seinem Python Code anwendet, bleibt ja jedem selber überlassen.

      Ich habe mir den GraphMultiEPG Code nun angesehen und bei der plugin.py wird beim der main Funktion die servicelist mit übergeben "def main(session, servicelist, **kwargs)". Daher kann man die main Funktion nicht so einfach mit einem Einzeiler aus der "neuen" plugin.py aufrufen wie bei anderen Plugins. In dem Fall könnte man aber die komplette main Funktion aus der originalen plugin.py in der "neuen" plugin.py übernehmen.

      Aber dir geht es ja hauptsächlich um die GraphMultiEpg.py: in der plugin.py wird nicht das komplette Modul, sondern nur eine Class importiert. In dem Fall muss man das zuest das Modul importieren, reloaden, und dann erst die Class importieren. Das Ganze sollte aber innerhalb der Funktion, die die Class aufruft, stehen und das war vermutlich der Fehler:

      Quellcode

      1. def openBouquetEPG(bouquet):
      2. services = getBouquetServices(bouquet)
      3. if len(services):
      4. global epg_bouquet
      5. epg_bouquet = bouquet
      6. import GraphMultiEpg
      7. reload(GraphMultiEpg)
      8. from GraphMultiEpg import GraphMultiEPG
      9. dlg_stack.append(Session.openWithCallback(closed, GraphMultiEPG, services, zapToService, changeBouquetCB))
      10. return True
      11. return False
      Alles anzeigen
    • Also es ist keine "Zauberei"; da wäre ich bei Dir. Aber wenn man etwas tut, um einen GUI-Neustart-Zwang zu umgehen, wird jener eben "augetrickst". So meinte ich das mit "Deinem Trick", auch wenn man sich da natürlich einem offiziellen Feature bedient... egal ;)

      Da ich auch diesmal nichts Lauffähiges mit Deinen Teil-Infos compilieren konnte, da Du scheinbar keine Lust hast, drei lauffähige Dateien zu attachen, oder zu quoten, damit man mal eine Vorlage hat, die man in Gänze versteht (was notwendig wäre, um diverstesten Plugins den GUI-Restart-Zwang abzugewöhen, auch wenn der Code halt mal etwas anders aussieht), gebe ich es nun auf... bedanke mich aber natürlich trotzdem für Deine Mühe.

      Natürlich habe ich auch gegoogelt und mir Deine Quell-Tipps für Python reload() angeschaut (auch schon Wochen vorher). Letztendlich brauchte ich nun aber ein praktisches Beispiel für ein Enigma2-Plugin, welches nicht gerade ein SpiegelOnline Plugin für Enigma2-Receiver ist, und welches auch nicht auf konventionelle Weise programmiert wurde. U.a. deswegen habe ich mir das GraphMultiEpg rausgesucht; denn "unkonventionell" kommt sicher hundertfach bei Enigma2-Plugins vor. Jeder Plugin-Programmierer arbeitet halt etwas anders.

      Grüße,
      chroma_key
      "Wenn das die Lösung ist, will ich mein Problem wieder zurück"
      Gesendet mit Fernsprecher

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von chroma_key ()

    • chroma_key schrieb:

      Da ich auch diesmal nichts Lauffähiges mit Deinen Teil-Infos compilieren konnte, da Du scheinbar keine Lust hast, drei lauffähige Dateien zu attachen, oder zu quoten, damit man mal eine Vorlage hat, die man in Gänze versteht (was notwendig wäre, um diverstesten Plugins den GUI-Restart-Zwang abzugewöhen, auch wenn der Code halt mal etwas anders aussieht), gebe ich es nun auf...

      Du bist der Knaller! Ich habe es dir doch oben gepostet, du musst gerade mal 3 Zeilen in die plugin.py einfügen und sonst nichts! Und ja, ich habe es getestet und ja es funktioniert.

      def openBouquetEPG(bouquet):
      services = getBouquetServices(bouquet)
      if len(services):
      global epg_bouquet
      epg_bouquet = bouquet
      import GraphMultiEpg
      reload(GraphMultiEpg)
      from GraphMultiEpg import GraphMultiEPG

      dlg_stack.append(Session.openWithCallback(closed, GraphMultiEPG, services, zapToService, changeBouquetCB))
      return True
      return False

      Wenn dir anscheinend selbst das zu kompliziert ist, kann ich dir auch nicht helfen und auf solche Frust-Kommentare dass ich keine Lust habe dir gescheit zu helfen kann ich verzichten.
    • Also es ist so: Ich brauche (bitte korrigiere mich)...

      1. Eine neue "plugin.py"
      2. Eine, nach "plugin_org.py" umbenannte, vorige "plugin.py"
      3. Eine unveränderte GraphMultiEpg.py, die ich dann später verändere, um ohne GUI-Neustart neue Sourcen ausführen zu können (das Ziel)

      Dazu brauche ich einen außerplanmässigen GUI-Restart, damit der untergeschummelte Part wenigstens einmal compiliert wird, mit dem Ziel, dass danach weitere Änderungen an der GraphMultiEpg.py ohne GUI-Neustart auch laufen.

      Da ich das nicht hinbekommen habe (sofern das überhaupt stimmt, oben), stellten sich mir die Fragen:

      - Wohin muss Dein gequoteter Code? Muss er in die neue "plugin.py", oder in die "plugin_org.py" !?
      - Was ich verstanden habe: Er muss in die neue "plugin.py"... War Dein gequoteter Code 100% der Inhalt der neuen "plugin.py", und sonst muss nix drinstehen, oder muss noch mehr darin stehen? Wenn noch mehr drin stehen muss, WAS? <--- Daran habe ich gestern geschraubt, und es nicht hinbekommen. ZB. die "globals" können ja nicht bekannt sein, wenn erst im Anschluss importet wird. Also habe ich sie oben eingefügt. Das reichte aber auch nicht. Nach 17 Restarts stelle ich fest, dass ich das nicht richtig mache, oder es nicht verständlich erklärt wurde. Doch das konnte ich mir nicht vorstellen, also schraube ich an der neuen "plugin:org.py" rum. Da auch diese Versuche misslingen, bin ich der Meinung, ich bin zu doof, und werde inzwischen emotional.
      - Ich frage mich: Was muss in die - nach "plugin_org.py" umbenannte "plugin.py" - denn nun reingeschrieben werden?
      - Ich fühle mich als total dämlicher Anfänger, da ich wirklich überhaupt keine Erfolge verzeichnen konnte; nicht mal Teilerfolge... Sprich: Ich nehme an, dass ich nichtmal irgendwas in Python je begriffen hätte, und eben wirklich gar nix kann, und gar nix weiß. Ich hege Selbstzweifel. Doch wie war es mir möglich, dass ich schon ganze Plugins mit Python programmiert habe, mit über 1000 Zeilen Code, die auch laufen... (zB. ARD und ZDF im "MediaPortal" sind KOMPLETT von mir). Ich verstand die Welt nicht...

      Deine Source-Ideen habe ich immer noch nicht einmal in Aktion erleben können. Habe sie offenbar immer noch nicht verstanden, und vermute, dass es nur eine Kleinigkeit ist, bis es "Klick" macht..
      Dann hatte ich mich gefragt, warum Du keine vollständig ausführbaren Attachments beigelegt-, oder gequotet hast, damit man es endlich kapiert, und habe anschliessend halb-emotionalisiert gepostet. Ich hatte schon vorgeahnt, dass es "unfreundlich" rüberkommen würde. Dafür entschuldige ich mich...

      Aber verstehe auch mich:
      - Ich teste und friemle. Ich bekomme es nicht hin
      - Ich bekomme Hilfe, die ich nicht 100% verstehe, und bekome es leider nicht hin
      - Ich bekomme nochmal Hilfe, die ich weiterhin nicht 100% verstehe, und bekomme es immer noch nicht hin, und nehme an, dass ich inzwischen bereits nerve (Attachment mit dem laufenden Code hätte mir geholfen)
      - Ich gebe (leicht genervt) auf, und bedanke mich aber trotzdem für die Mühe
      - Du antwortest (wie zu erwarten war) enttäuscht auf mein Nix-Raff-Mecker

      Wenn Du doch noch nicht komplett END-genervt sein solltest (was mich natürlich freuen würde), dann würde ich mich wirklich über ein Attachment mit den 3 benötigten Dateien freuen, mit denen alles 100% läuft. Das sehe ich mir dann genau an, vergleiche es mit Deiner Idee für Spiegel-Online, verstehe es dann hoffentlich in Gänze, weiß dann wie das funktioniert, und lasse Dich wieder in Ruhe :) Ich versprech's... ;)

      LG, chroma_key
      "Wenn das die Lösung ist, will ich mein Problem wieder zurück"
      Gesendet mit Fernsprecher

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von chroma_key ()

    • Nein, du brauchst nur die 3 Zeilen vor dem Aufruf des zuvor importierten "GraphMultiEPG" Moduls in der original plugin.py einfügen und Enigma neu starten, sonst nichts:

      def openBouquetEPG(bouquet)
      ...
      import GraphMultiEpg
      reload(GraphMultiEpg)
      from GraphMultiEpg import GraphMultiEPG

      dlg_stack.append(Session.openWithCallback(closed, GraphMultiEPG, services, zapToService, changeBouquetCB))

      Wegen den 3 Zeilen muss ich ja nicht extra die plugin.py anhängen.

      Das Umbenennen der plugin.py ist nur dann notwendig, wenn du später - ohne Enigma Neustart - an der plugin.py etwas ändern willst. Da du aber erstmal nur die GraphMultiEpg.py ändern willst, ist das nicht notwendig. Also nur den 3-Zeiler in der plugin.py einfügen und Enigma neu starten. Dann kannst du Änderungen an der GraphMultiEpg.py vornehmen und bei jedem Plugin Start wird diese neu kompliliert und eingelesen. So kannst du auch mit anderen Modulen oder Plugins verfahren.

      Nur wenn du Änderungen an der plugin.py selber machen willst, wird es komlizierter, da du diese ja nicht aus sich selbst heraus reloaden kannst. Da hilft dann das "Hilfskonstrukt" einer neuen plugin.py, in der du innerhalb einer neuen Funktion die orignale und zuvor umbenannte plugin.py importierst, reloadest und dann erst die eigentliche main Funktion aus der originalen plugin.py aufrufst (siehe oben das SPIEGEL Beispiel) oder die main Funktion gleich ganz in die neue plugin.py übernimmst.

      Aber das alles benötigst du bei einem einzelnen Modul wie der GraphMultiEpg.py nicht, dort reicht der 3-Zeiler innerhalb der Funktion vor dem Aufruf des Moduls. Wird bei einem Plugin das komplette Modul und nicht nur eine einzelne Class importiert, also kein "from... import...", sondern nur ein "import..." des kompletten Moduls, reicht der 2-Zeiler:
      import MeinModul
      relaod(MeinModul)

      Wichtig ist, dass du das innerhalb der Funktion vor dem Aufruf des Moduls machst, da lag vermutlich auch dein Fehler.
    • AUA! AUAUAUAUA!

      OK, es geht nun. Und nicht nur das, sondern ich habe es nun auch endlich kapiert.

      Du glaubst gar nicht, was für einen unnötigen Aufwand ich hier betrieben habe. Hatte schon gut 40 Zeilen neuen Code in diversen py's dazugetextet, da ich immer dachte, dass Du nur eine bedeutende Stelle beschreibst, und diversen Kleinkram beim Erklären weggelassen hast.
      Komplett missverstanden, das Ganze... Zudem war ich ab irgendwann noch in der falschen Class, und hatte daher nicht bemerkt, dass es die so schon gab. Zu Allem Überfluss hatte ich am nächsten Tag auch noch in meiner verkorksten py weitergemacht, statt in der Originalen...

      Also solch einen Balken hatte ich bislang auch noch nicht vor Augen. :lesen: :denk: :doh: :mauer:
      Sorry nochmal... und danke! Mal schaun, was man damit so alles Interessante anfangen kann. Coole Sache.
      "Wenn das die Lösung ist, will ich mein Problem wieder zurück"
      Gesendet mit Fernsprecher
    • Schön dass es nun funktioniert :thumbup: und der Groschen gefallen ist :) Im Prinzip ist das Ganze ja recht einfach, der reload muss nach dem import und vor dem Aufruf des Moduls oder der Class in der Funktion stehen. Nur wenn es um die plugin.py selber geht, wird es komplizierter und das war vermutlich auch das Missverständnis.