Hey leute,
ich habe folgendes Problem:
Und zwar möchte ich mit Python Daten von einer json API abgreifen. Ich lese erst eine usereingabe ein, setzte dann eine Variable mit der API url, und hänge mit dem + die Variabel mit der Usereingabe hinten dran.
Danach mache ich per request .get(url) die Abfrage auf die API.
Problem an der sache ist jetzt, dass sich zwei mal die Tastatur öffnet, und der [definition='1','0']log[/definition] sagt, dass er kein Boolean mit einem String verketten kann.
Ich vermute, dass mein request beim Variablenaufruf die Variabel quasi refresht, und deshalb die Tastatur aufruft. Im selben moment kommt wahrscheinlich die eingabe (nichts) in die variable und verursacht den Fehler.
Vielleicht kann ja jemand helfen.
Python string Klonen?
-
XsupergurkeX -
27. Dezember 2016 um 19:39 -
Erledigt
-
-
Die Fehlermeldung sagt doch alles. Du versuchst 2 Variablen unterschiedlichsten Types (String und boolean) zu verketten. Ich kenne Deinen code jetzt nicht und weis auch nicht was Du machen willst aber wenn es darum geht einen neuen String zu bilden und ein Typ kein String ist, kannst Du den Nichtstring wandeln. Z.B. geht das mit str() also zb String1 = String2 + str(boolean)
Dann kommt aber sowas raus wie test + True also testTrue wenn der Inhalt von String2 vorher 'test' war.Ich denke da liegt eher ein Logikfehler vor.
Wenn Du Hilfe benötigst, wirst Du wohl den ganzen Code posten müssen.
-
-
Danke schon mal. Den Fehler habe ich schon verstanden. Ist ja auch ziemlich eindeutig, allerdings habe ich das Problem, dass ich den Fehler nur bekomme, wenn ich versuche mit dem verketteten string ein http request zu machen. Lasse ich ihn mir einfach ausgeben, zeigt er mir den richtigen String an. Hier der Code:
CodesSearchText = cGui().showKeyBoard('german') url2 = 'http://127.0.0.1:8080/api/movies/' + sSearchText url3 = '' for x in range(0, len(url2)): url3 = url3 + url2[x] r = requests.get(url3) xbmcgui.Dialog().ok(addonname, url3)
Url 3 hatte ich erstellt, weil ich gehofft hatte, dass die Tastatur beim request dann nicht erneut aufspringt.
-
Mit python und gui habe ich noch nie etwas gemacht. Aber wenn das Keyboard 2 mal aufgerufen wird, scheint es so zu sein, dass der Programmteil 2 mal aufgerufen wird. Warum auch immer. Das sehe ich jetzt hier nicht.
Frage doch erstmal ab ob der Rückgabewert einen Inhalt hat. Erst dann machst Du weiter.
Pythonif not sSearchText: xbmc.[definition='1','0']log[/definition]("Fehler:" + str(sSearchText)) else: ... xbmc.[definition='1','0']log[/definition]("User hat eingegeben:" + str(sSearchText)) xbmc.[definition='1','0']log[/definition]("Request lautet: http://127.0.0.1:8080/api/movies/" + str(sSearchText)) hier gehts weiter
Sowas in der Art. Was passiert denn dann? -
-
Ich hab deinen Code jetzt unter sSearchText = cGui().showKeyBoard('german') kopiert. Leider der gleiche Fehler.
Ich kann mir den string ja auch ausgeben. Per xmbc.dialog z.B. wird er mir ja auch richtig angezeigt. Kommentiere ich das HTTP Request aus, kommt kein Fehler, und die Tastatur wird auch nicht noch einmal geöffnet. Ich denke, dass in dem moment, wo das request die Variabel aufruft, sie sich quasi aktualisiert.Edit: Ich habe jetzt folgenden Code:
CodesSearchText = cGui().showKeyBoard('german') if not sSearchText: xbmc.[definition='1','0']log[/definition]("Fehler:" + str(sSearchText)) xbmcgui.Dialog().ok(addonname, "error") else: search2 = sSearchText xbmcgui.Dialog().ok(addonname, search2) url2 = "http://127.0.0.1:8080/api/movies/" + search2 r = requests.get(url2)
Es passiert folgendes:
1. Die Tastatur öffnet sich, und ich mache meine Eingabe
2. Eine Dialogbox zeigt mir meine Eingabe
3. Nach dem bestätigen öffnet sich erneut die Tastatur
4. Kurz darauf das Dialogfenster, was mir den richtigen link zeigt
5. Es öffnet sich ein letztes Dialogfenster, mit "error" und Kodi schmeißt den bekannten Fehler -
Leider sehe ich nicht wo der Fehler herkommen kann. Es muss aber dann wohl tatsächlich etwas mit dem request zu tun haben.
Wenn Du magst kannst Du mir das komplette script irgendwo hochladen. Auch per PM wenn Du das nicht öffentlich haben möchtest. Dann schaue ich mir das in meiner Testumgebung mal an.
-
-
Danke für deine Mühe, mein Code sieht zur Zeit so aus:
http://pastebin.com/0tKyURNQIst ziemlich zusammengewürfelt, ich weiß
die funktion GUIEditExportName kannst du eigentlich komplett aussen vor lassen. Damit habe ich erst die Tastatur aufgerufen, die hat aber Fehler gemacht. -
Ok. Nach etlichen nachinstallieren von modulen, konnte ich das script dann starten.
Ich nutze zum testen diesen code:
Ich habe soweit alles dringelassen, um evtl dem Problem auf die Spur zu kommen.Python
Alles anzeigenimport xbmcaddon import xbmcgui import sys import xbmcplugin import urllib, json import requests from resources.lib.gui.gui import cGui from resources.lib.gui.guiElement import cGuiElement import sys from urllib import urlencode #from urlparse import parse_qsl import xbmcgui import xbmcplugin import xbmc addon = xbmcaddon.Addon() addonname = addon.getAddonInfo('name') #addon_handle = int(sys.argv[1]) addon_handle = 999 xbmcplugin.setContent(999, 'movies') url = 'http://localhost/some_video.mkv' li = xbmcgui.ListItem('My First Video!', iconImage='DefaultVideo.png') xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li) xbmcplugin.endOfDirectory(addon_handle) sSearchText = cGui().showKeyBoard('german') if not sSearchText: xbmc.[definition='1','0']log[/definition]("Fehler:" + str(sSearchText), level=xbmc.LOGNOTICE) xbmcgui.Dialog().ok(addonname, "error") else: search2 = sSearchText xbmcgui.Dialog().ok(addonname, search2) url2 = "http://127.0.0.1:8080/api/movies/" + search2 r = requests.get(url2) xbmcgui.Dialog().ok(addonname, url2)
Nach dem starten des scripts geht ein Fenster auf und das Wort 'german' steht schon da. Zum testen habe ich dann mal etwas anderes eingegeben und zwar blubblub
Danach bekomme ich noch ein testfenster mit blubblub und danach wird der request gemacht. Ohne Probleme, ohne das ein zweites mal das Keyboard aufgeht.
Hier das [definition='1','0']log[/definition] was natürlich den Fehler wirft im request module weil die url nicht antwortet:Code
Alles anzeigenError Contents: HTTPConnectionPool(host='127.0.0.1', port=8080): Max retries exceeded with url: /api/movies/blubblub (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x1BD0D3F0>: Failed to establish a new connection: [Errno 10061] No connection could be made because the target machine actively refused it',)) Traceback (most recent call last): File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.test\default.py", line 38, in <module> r = requests.get(url2) File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.module.requests\lib\requests\api.py", line 67, in get return request('get', url, params=params, **kwargs) File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.module.requests\lib\requests\api.py", line 53, in request return session.request(method=method, url=url, **kwargs) File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.module.requests\lib\requests\sessions.py", line 468, in request resp = self.send(prep, **send_kwargs) File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.module.requests\lib\requests\sessions.py", line 576, in send r = adapter.send(request, **kwargs) File "I:\Kodi\kodi 17 beta6\portable_data\addons\script.module.requests\lib\requests\adapters.py", line 437, in send raise ConnectionError(e, request=request) ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=8080): Max retries exceeded with url: /api/movies/blubblub (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x1BD0D3F0>: Failed to establish a new connection: [Errno 10061] No connection could be made because the target machine actively refused it',)) -->End of Python script error report<--
somit kann ich leider nur sagen das Dein code funktioniert und das Problem woanders zu suchen ist. Evtl in den verwendeten modulen oder verweisen. -
-
Ein fettes danke für deine Hilfe. Das das problem bei anderen request links nicht auftritt ist mir auch grad aufgefallen.
Irgendwie merkwürdig. Meine API braucht ein paar sek. zum Antworten, dachte erst, das es daran liegt, aber dann würde requests ja ein Timeout als Fehler raus geben.Edit: Ohne scheiss, ich könnte dir die Füße küssen
Ich weiß nicht, was du anders gemacht hast, aber hab meinen code mit deinem überschrieben, und siehe da: Es rennt.
Bin jetzt seit über ne Stunde dabei, den String irgendwie abzukapseln. Hab mir sogar eine extra funktion für die suche gebaut, die die url zurückgibt, aber alles ohne Erfolg. -
Versuch doch mal ein try/catch um den request zu machen. Dann sollte im Fehlerfall das Programm in den catch springen und du kannst weiter reagieren.
-
-
Ich weiß nicht, ob du mein Edit mit bekommen hast, aber du hast mein Problem gelöst
-
das einzige was ich geändert habe ist die variable addon_handle. Die hatte ich static mit einem int definiert. Wenn du Bock hast kannst Du das ja nochmal wieder reinnehmen und nochmals testen.
-
-
Ja, der fehler lag im addon_handle.
Problem ist jetzt nur, dass ich meine Liste nicht angezeigt bekomme. Was macht das handle genau?
Wenn ich einfach eine Zahl nehme öffnet sich die Liste nicht, und (sys.argv[1]) verursacht den Keyboard Fehler. -
Ich vermute du moechtest ein plugin fuer Addon entfernt - die Moderation entwickeln. Somit wird dein script nicht von kodi direkt (so wie ich es zum testen gemacht hatte, deswegen der static handle) sondern vom Addon entfernt - die Moderation aufgerufen.
Der Addon entfernt - die Moderation uebergibt deinem script eine handle id. Wenn Du dann die Daten hast zeigt das Addon entfernt - die Moderation diese dann über den handle an. Somit weis das xstream woher alles kommt. vereinfacht ausgedrueckt.Das Problem scheint also wenn ich richtig liege mit dem Addon entfernt - die Moderation zusammenzuhaengen. Somit musst Du dich wohl oder uebel mit der Entwicklung von Addon entfernt - die Moderation plugins auseinandersetzten.
So wie ich es kurz gesehen habe, haben die auch ein Forum. Im Zweifelsfall da nochmals nachfragen.
-
-
Sorry
So oft in einem Beitrag, da konnte ich nicht widerstehen. Wenn es aber wirklich das Addon ist bitte nicht hier @TO -
@SkyBird1980, da hast du wohl 2 übersehen
Auch wenns vielleicht so aussieht, ich versuche nicht ein Plugin für dieses Addon zu schreiben. Ich will Nachts ja noch ruhig schlafen ;D
Ich habe Resourcen von dem Addon verwendet, weil ichs nicht hinbekommen habe eine fehlerfreie Tastureingabe aufzurufen. Die def GUIEditExportName ist ja noch drin, hat aber Fehler produziert. Ich hab dann auf Github gesuscht, wo ich mich bedienen kann.
Wahrscheinlich hast du schon gemerkt, das ist ein absoluter Python Noob bin. Das Plugin soll eigentlich nur folgendes machen: Tastatur öffnen, api mit der suche im link aufrufen und dann die Ergebnisse als Listitems anzeigen. Klappt ja auch schon, wäre da nicht das Problem mit der Tastatur. Ich versuche mal, die Eingabe anders zu starten.
Danke dir auf jeden Fall für deine Unterstützung, und der Erklärung mit dem Handle. Hab noch bis 2 Uhr dran rumgespielt ^^.Edit: Keine Änderung. Ich habe
Entfernt, und auch den resources Ordner gelöscht. Die Suche übernimmt jetzt wieder GUIEditExportName
Mein Addon wird als VideoAddon gestartet, sollte aber keinen Unterschied machen, oder? -
-
War eh verkehrt geschrieben
-
Sehr unübersichtlich hier
Was ist jetzt der Stand?
In kodi die Tastatur öffnen und einen String eingeben? -
-
1. Videoaddon startet
2. Die Tastatur öffnet sich
3. Es wird ein Request gemacht
4. Eine Liste wird erstellt
5. Die Tastatur öffnet sich erneut
6. Ich bekomme die Dialogbox "error" (im if not Zweig)
Zwischendurch werden immer mal Dialogboxeen geöffnet, die mir zeigen, was gerade im Code vorgeht.Hier der aktuelle Code:
http://pastebin.com/nYJwfdHQDie Flag war mein versuch, das erneute öffnen zu verhindern.
Danke schon mal
-
Ich hab noch etwas am code gespielt, und der Fehler muss am Request liegen. Lasse ich das anhängen der Variabel weg, und schreibe einen Suchbegriff in den Standardstring öffnet sich die Tastatur nur einmal. Die Suche Funktioniert so natürlich nicht.
-
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!