IDLE gibt nichts mehr aus

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

Hallo,
ich bin Python-Neuling und stehe vor einem kleinem Problem.
Seit ein paar Tagen arbeite ich an einem kleinem Pythonprogramm . Heute wollte ich an diesem Programm weiter schreiben und kurioserweise bekomme ich in IDLE keine Ausgaben mehr zusehen. Fehlermeldungen erscheinen auch keine in PyCharm Funktion das selbe Programm ohne Fehler.
Auch neue und andere Programme funktionieren mit IDLE nur dieses eine gibt einfach nichts mehr aus.
Weder auf meinem Windowsrechner noch auf meinem Rasperry Pi .
Hat jemand eine Erklärung dafür?
Benutzeravatar
Cronut
User
Beiträge: 34
Registriert: Sonntag 5. Februar 2017, 09:50
Wohnort: HRO, GER

Ein paar mehr Infos wären schön nötig. Hier gibt es viele Punkte, wo man ansetzen könnte.
Wie sieht der Code aus?Wie ist IDLE konfiguriert? Hast du kürzlich an den Einstellungen gedreht?
Benutzt du Logging?
“Clean code always looks like it was written by someone who cares.” (Michael Feathers)
Check out: https://awesome-python.com/
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

nein ich habe nichts verstellt .
Das seltsame ist das IDLE unter Windows mir dem Programm nichts mehr ausgibt noch auf meinem Raspi.
den Code wollte ich eigentlich nicht veröffentlichen..zum einem ist er wohl sehr schlecht , zum anderen funktioniert er ja es wird in IDLE nur nichts mehr ausgegeben.
Es geht um ein Programm welches die Anrufsliste der Fritzbox ausliest und die Daten als XML speichert und das funktioniert auch wenn ich es mit IDLE ausführe.Ich habe an einigen Stellen im Programm an paar Print's eingebaut und eben diese werden plötzlich nicht mehr ausgegeben.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
den Code wollte ich eigentlich nicht veröffentlichen...zum einem ist er wohl sehr schlecht
Wenn du die Eigenmotivation hast, besser zu werden, ist genau _das_ der Grund, den Code hier zu posten. Eben um Verbesserungsvorschläge zu erhalten.
und eben diese werden plötzlich nicht mehr ausgegeben.
Mit `print` erfolgt die Ausgabe nach stdout - vielleicht hast du da was verstellt? Oder die Programmzeilen, die die `print` Anweisung enthalten, werden gar nicht ausgeführt? Dazu müssten man aber den Code sehen...

Gruß, noisefloor
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Pi_Noob:
Du fürchtest dich anscheinend vor konstruktiver Kritik. Nimm diese nicht als Meckern wahr, sondern als Hilfestellung. Im Übrigen bleibt es dir dann selbst überlassen, ob bzw wieviele von den Vorschlägen du auch tatsächlich umsetzt (ist ja auch mit entsprechendem Aufwand und Zeit verbunden, die man möglicherweise im Moment nicht hat*). Zumindest die Punkte, die das vorliegende Problem verursachen, sollte man aber natürlich schon abarbeiten. Sonst ist es auch ärgerlich für die Helfenden.

*Und auch dies ist eigentlich ein schwaches Argument, da langfristig gesehen guter Code viel mehr Zeit einsparen würde verglichen mit dem kurzfristig zeitraubenden Aufwand für die Verbesserung und das Verstehen der Hintergründe zur Verbesserung.
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

Ok hier mal die Code-Stücke um die es geht:

Code: Alles auswählen

#!/usr/bin/python

import fritzconnection as fc
import requests
from requests.auth import HTTPBasicAuth

import xml.etree.ElementTree as ElementTree
import re
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')





con = fc.FritzConnection(address='192.168.0.1', password='blabla')

print con.call_action('X_AVM-DE_OnTel', 'GetCallList')


myString = str(con.call_action('X_AVM-DE_OnTel','GetCallList'))

myString = myString.replace("{", "")
myString = myString.replace("'", "")
myString = myString.replace("}", "")
print myString
print re.search("(?P<url>https?://[^\s]+)", myString).group("url")
myString = re.search("(?P<url>https?://[^\s]+)", myString).group("url")

r = requests.get(myString)



file = open("data.xml", 'w')
file.write(r.text)
file.close()






tree = ElementTree.parse('data.xml')
root = tree.getroot()
root.getchildren() [1].getchildren()


for child in root.getchildren() [1].getchildren():
   print child.tag, child.attrib


res = ""
s = 0
for call in root.findall('Call'):
   if (call.find('Type').text == '2') : 
      name = call.find('Name').text
      date = call.find('Date').text
      if not name:
         name = 'Unbekannt'

      res = res + name + "  am  :" + date + "\n"
      s = s + 1
      if s == 6 :
          break



print res

r = requests.get("http://192.168.0.25/web/message?text=" + res + "&type=1&timeout=18")
print r.status_code
Ich hole mir aus der Fritzbox die Anrufsliste , daraus schneide ich die reine URL aus. Diese übergebe ich dann dem Request und hole die Liste in Form einer XML diese speichere in dann. Jetzt lade ich sie in den Parser und filtere alle Daten raus die vom Typ 2 sind(nichtangenommene Anrufe).
Von denen nehme ich nur die Ersten 6 Einträge.
Jetzt schicke ich das ganze an meinen Reveiver(enigma2) und der gibt es als Message auf dem Fernseher aus.


Das ganze funktioniert tadellos nur die eingebauten print's werden nicht mehr ausgegeben mit IDLE. Mit PyCharm erhalte ich auch die prints.
BlackJack

@Pi_Noob: Der Fehler liegt in den Zeilen 11 und 12 die da nichts zu suchen haben. Es gibt einen *Grund* das `sys.setdefaultencoding()` nicht einfach so verfügbar ist und der ist das es nicht benutzt werden soll. Der Startupcode löscht diesen Namen absichtlich damit man ihn als Benutzer des Moduls nicht mehr zur Verfügung hat.
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

wenn ich die beiden Zeilen rausnehme erhalte ich folgende Fehlermeldung:

Traceback (most recent call last):
File "C:\Arbeit\Python_2_7\test_fritz_neu.py", line 37, in <module>
file.write(r.text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 9089: ordinal not in range(128)
BlackJack

@Pi_Noob: Dann musst Du die Datei entweder als Textdatei mit Kodierungsangabe mit `io.open()` öffnen, oder die Unicode-Zeichenkette explizit kodieren.
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

Ich danke Dir für Deine Mühe .Die Printausgaben erfolgen nun wieder , dafür ist jetzt der Rest ohne Funktion.
Ich bin auf dem Gebiet Python noch absoluter Neuling ,werde mich da noch weiter belesen.
Vielleicht könnte mir jemand anhand meines Codes zeigen wie es richtig gemacht wird.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Pi_Noob: con.call_action liefert Dir ein schönes Wörterbuch? Warum wandelst Du das in einen String und bearbeitest das mit replace? Greif einfach direkt auf die Werte zu. Wenn Du keinen Text brauchst, sondern nur die Bytes von Deinem Request in eine Datei schreiben willst, dann ließ einfach Bytes; und ElementTree kann auch von einem String lesen, da ist das Schreiben in eine Datei ein unnötiger Schritt. if ist keine Funktion, die Klammern gehören da also nicht hin. Wenn man eine Zählvariable in einer for-Schleife braucht nimmt man enumerate, hier wäre aber islice noch besser, da Du ja nur die ersten 6 Elemente willst. Strings stückelt man nicht mit + zusammen, sondern benutzt .format
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

Hi Sirius,
con.call_action liefert noch nicht das ganze Wörterbuch bzw. Anrufsliste. Es liefert eine URL die auch die SessionID enthält mit dieser kann ich das erst mittels Request die XML abholen. Das mit Zwischenspeichern und wieder laden wollte ich mir auch sparen das habe ich aber auch noch nicht hinbekommen.
Das mit Strings werde ich mir zu Herzen nehmen und nochmal überarbeiten, stehe hier mit Python noch am Anfang.
Ich habe übrigends jetzt ein

import codecs

hinzugefügt und die Zeile so geändert

file = codecs.open("data.xml", 'w','utf-8')

Jetzt läuft das Programm wieder und es werden auch die print's ausgegeben.
die Klammern hinter dem If hatte vergessen rauszunehmen , ich hatte dahinter eigentlich 2 Bedingungen mit einem or getrennt.
Vielen Dank für eure Hilfe.
BlackJack

@Pi_Noob: `con.call_action` liefert aber trotzdem ein Wörterbuch, ob da nun schon die endgültigen Daten drin sind oder nur URLs ist egal, man wandelt das nicht in eine Zeichenkette um um an Daten heran zu kommen.

Auch bei einem ``or`` braucht's keine Klammern, solange man nicht tatsächlich eine andere Auswertungsreihenfolge erzwingen will. Das wären dann in der Praxis eher Klammern um einen Teilausdruck der ``or`` *enthält* und beispielsweise mit ``and`` mit etwas anderem verknüpft wird.

Warum `codecs.open()`? Was meinst Du ist daran besser als an `io.open()`?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dass man das Dict als String sieht, ist nur als Lesehilfe gedacht. Werte aus dem Dict holt man mittels:

Code: Alles auswählen

my_dict['key']
Wobei "key" der Name des Schlüssels (sozusagen: die Kategorie) ist.

Benannte Gruppen (hier: "url") bei einer Regex, wenn es nur eine Gruppe gibt, finde ich auch ungewöhnlich. Zumal man die Info vielleicht auch direkt als Wert abfragen könnte, wenn man die komischen String-Operationen auf der Datenstruktur des Dicts weg lässt.
Pi_Noob
User
Beiträge: 7
Registriert: Sonntag 5. Februar 2017, 21:32
Wohnort: Korschenbroich

@Snafu: das mit dem Dict habe ich jetzt auch ansatzweise begriffen und umgesetzt.Das ganze Stringgedöns ist somit weg.
ich habe das jetzt so umgesetzt :

Code: Alles auswählen

 
con = fc.FritzConnection(address='192.168.0.1', password='blabla')
anrufliste = con.call_action('X_AVM-DE_OnTel', 'GetCallList')
for key in anrufliste :
   r = requests.get(anrufliste[key])
Jetzt will ich dem Parser direkt den Request übergeben , nicht mehr der Umweg über speichern und laden. Mal sehen wie ich das hinbekomme :K
Antworten