[Erledigt] webif seiten mit urllib2 aufrufen

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

  • [Erledigt] webif seiten mit urllib2 aufrufen

    Ich möchte eine webif Webseite mit urllib2 (urllib habe ich auch schon getestet) in einem Plugin öffnen.

    Wenn ich ein simples script in /home ablegen, und den code rein schreibe und übers terminal starte, dann funktioniert es.

    wenn ich es in einen Plugin aufrufen möchte, dann kommt das Rädchen und die Box ist endlos beschäftigt, was muss noch in den Code, damit es funktioniert?


    Python-Quellcode

    1. url = urllib2.urlopen("http://localhost/web/getpid")
    2. lesen = url.read()
    3. print(lesen)
    Es steckt immer in "url = urllib2.urlopen("http://localhost/web/getpid")" fest laut log.
  • bei mir funktioniert das.
    Es kommt darauf an, wann du die Abfrage startest. Ist der Webserver (noch) nicht verfügbar, gibts nen Crash

    14:04:03.853 [e2-python] [PSTART] Start
    14:04:04.868 [e2-python] [PSTART] urllib2
    14:04:04.886 [e2-python] [PSTART] ERROR <class 'urllib2.URLError'> <urlopen error [Errno 111] Connection refused>
    Web-Server - OK
    14:04:18.854 [e2-python] [PSTART] urllib2
    14:04:18.865 [e2-python] [PSTART] read
    14:04:18.865 [e2-python] [PSTART] lesen= 0,64,4ff,500
    14:04:18.865 [e2-python] [PSTART] END

    Python-Quellcode

    1. # -*- coding: utf-8 -*-
    2. from Plugins.Plugin import PluginDescriptor
    3. from threading import Timer
    4. import traceback
    5. import sys
    6. import urllib2
    7. def autostart(reason, **kwargs):
    8. try:
    9. if kwargs.has_key("session") and reason == 0:
    10. session = kwargs["session"]
    11. print "[PSTART] Start"
    12. thread = Timer(1,run)
    13. thread.start()
    14. thread = Timer(15,run)
    15. thread.start()
    16. except:
    17. print "[PSTART] ERROR", sys.exc_info()[0],sys.exc_info()[1]
    18. traceback.print_exc()
    19. def Plugins(path,**kwargs):
    20. list = []
    21. list.append(PluginDescriptor(where = [PluginDescriptor.WHERE_SESSIONSTART, PluginDescriptor.WHERE_AUTOSTART], fnc = autostart))
    22. return list
    23. def run():
    24. try:
    25. print "[PSTART] urllib2"
    26. url = urllib2.urlopen("http://localhost/web/getpid")
    27. print "[PSTART] read"
    28. lesen = url.read()
    29. print "[PSTART] lesen=",lesen
    30. print "[PSTART] END"
    31. except:
    32. print "[PSTART] ERROR", sys.exc_info()[0],sys.exc_info()[1]
    33. traceback.print_exc()
    Alles anzeigen
    Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
    Debug Log aktivieren Putty Telnet Screenshots erstellen
  • Also klappt es nur mit

    Quellcode

    1. threading.Timer
    Denn wenn ich es weg lasse, kommt nur die Beschäftigung des recis.
    Mit dem Timer (1 Sekunde) klappt das wie es soll.
    Also wäre es immer ratsam, wenn man eine url abruft oder öffnet, den Timer zu setzen?
    Vielen Dank
  • Ich tippe das Wichtige ist, dass du einen eigenen ausführbaren tread aufmachen musst für deinen Code

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

  • Meine code schnipsel sehen so aus:

    Python-Quellcode

    1. class getpid(Screen):
    2. .
    3. .
    4. .
    5. def __init__(self, session):
    6. self.session = session
    7. Screen.__init__(self, session)
    8. self["myLabel"] = Label("self.run")
    9. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel":self.cancel})
    10. thread = Timer(1,self.run)
    11. thread.start()
    12. def run(self):
    13. try:
    14. url = urllib2.urlopen("http://localhost/web/getpid")
    15. get_line = url.read().decode('utf-8').rstrip().replace(",", " ")
    16. ergebnis = int(get_line.split()[2], 16)
    17. print(ergebnis)
    18. return str(ergebnis)
    19. except:
    20. print("no")
    Alles anzeigen
    Wenn ich jetzt aber in der "__init__" Funktion "print(self.run())" eintrage, habe ich wieder das spinner-rädchen
  • Ich meine, das Spinner kommt immer, wenn man nicht mehr zum Hauptloop von Enigma zurückkommt und du bleibst vermutlich in der Methode stecken, weil das kein eigener Thread ist aber auch ein wenig Halbwissen bei mir, ich denke, hajeku123 kann das genauer erklären
  • So nachdem ich jetzt nochmal alles getestet habe lange Zeit, und immer noch nicht weiter bin (in /home/script.py per terminal starten funktioniert das wunderbar) hängt es immer noch an einer Stelle mit dem Plugin mit Gui.
    Jetzt habe ich mal das script vereinfacht um mal zu erkennen wo der Fehler liegt.
    Hier erstmal das script:

    Python-Quellcode

    1. from Screens.Screen import Screen
    2. from Components.Label import Label
    3. from Components.ActionMap import ActionMap
    4. from Plugins.Plugin import PluginDescriptor
    5. import urllib
    6. from threading import Timer
    7. import sys
    8. class videopid(Screen):
    9. skin = """ <screen position="10,60" size="800,120" >
    10. <widget name="myLabel" position="10,60" size="800,120" font="Regular;20"/>
    11. </screen>"""
    12. def __init__(self, session):
    13. self.session = session
    14. Screen.__init__(self, session)
    15. self["myLabel"] = Label("Label")
    16. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel": self.cancel})
    17. thread = Timer(1,self.run)
    18. thread.start()
    19. print("methode run", self.run)
    20. print("methode probe", self.probe())
    21. def run(self):
    22. try:
    23. url = urllib.urlopen("http://localhost/web/getpid")
    24. lesen = url.read()
    25. print("in Methode print", lesen)
    26. return lesen
    27. except:
    28. print("no")
    29. def probe(self):
    30. txt = "test"
    31. return txt
    32. def cancel(self):
    33. self.close(False,self.session)
    Alles anzeigen
    Es wird mir das "print("methode probe", self.probe())" und das "print("in Methode print", lesen)" im log angezeigt, bei "print("methode run", self.run)" zeigt mir der log


    Quellcode

    1. ('methode run', <bound method videopid.run of <class 'Plugins.Extensions.Bitanzeige.test.videopid'>>)
    an.
    Würde also heißen es funktioniert nur mit Parameter Klammern, wenn ich sie aber setze, dann kommt das spinner logo und die Box hängt sich auf.

    Sicherlich ist es bestimmt von mir Unwissenheit, aber ich bin für jeden Rat dankbar.

    OT:
    Das ganze soll mal ein Plugin werden, was immer die aktuelle Bitrate des jeweiligen Senders anzeigt, damit man per Knopfdruck sieht, wie bei den aktuellen Sender die Auflösung ist, ist gerade bei Sky interessant, weil sie es nicht so ernst nehmen mit ihrer Auflösung...
    OT off
  • Was ist denn an dem, was @anudanan geschrieben hat schwer zu verstehen?
    Du brauchst für urllib einen idle main thread, welchen du nicht hast, wenn __INIT__ über Plugin Erweiterungen aufgerufen und darin urlib gestartet wird.
    Daher habe ich dir auch geschrieben, dass du einen separaten Thread brauchst, der nach Beendigung von __INIT__ aufgerufen wird.
    Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
    Debug Log aktivieren Putty Telnet Screenshots erstellen
  • nein, du hast es in #5 doch schon selbst geschrieben.
    Das läuft innerhalb der Klasse.

    musst nur das Ergebnis in einer Variablen speichern, welche dann später benutzt werden kann

    Python-Quellcode

    1. class getpid(Screen):
    2. .
    3. .
    4. .
    5. def __init__(self, session):
    6. self.session = session
    7. Screen.__init__(self, session)
    8. self["myLabel"] = Label("self.run")
    9. self["myActionMap"] = ActionMap(["SetupActions"],{"cancel":self.cancel})
    10. self.ergebnis = ""
    11. thread = Timer(1,self.run)
    12. thread.start()
    13. def run(self):
    14. try:
    15. url = urllib2.urlopen("http://localhost/web/getpid")
    16. get_line = url.read().decode('utf-8').rstrip().replace(",", " ")
    17. self.ergebnis = int(get_line.split()[2], 16)
    18. except:
    19. print("no")
    Alles anzeigen
    Rechtschreibfehler sind beabsichtigt, sie fördern ein genaueres Lesen
    Debug Log aktivieren Putty Telnet Screenshots erstellen