Internet Speedtest

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 07:51

Also wenn ich den try: except über der while-Schleife schreibe geht es gut aber in der while-Schleife gibt er mir einen Fehler aus.

Code:


  1. #!/usr/bin/python
  2. import urllib2
  3. import urllib
  4. import time
  5. from datetime import datetime
  6. import subprocess
  7. import sys
  8. import os
  9.  
  10. LON = 0
  11. LAT = 0
  12. # Geschwindigkeit messen
  13. def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
  14.        # try:
  15.                 f = urllib.urlopen(url)
  16.         #except IOError:
  17.        #         subprocess.call(["./Verbindungsaufbau"])
  18. #        exit(0)
  19.  #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  20.   #      except IndexError:
  21.    #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  22.     #            exit(0)
  23.      #   else:  
  24.                 tStart = datetime.now()
  25.                 amount = 0
  26.                 x = 0
  27.     while ((len(f.read(buf))==buf) and (x<= 6)):
  28.                 try:
  29.                         f = urllib.urlopen(url)
  30.                 except IOError:
  31.                         subprocess.call(["./Verbindungsaufbau"])
  32.                         exit(0)
  33.                         print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  34.                 else:
  35.                         tEnd = datetime.now()
  36.                         dif = (tEnd - tStart).total_seconds()
  37.                         LAT=sys.argv[1]
  38.                         LON=sys.argv[2]
  39.                         if (dif >= intervall):
  40.                                 print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
  41.                                 amount = 0
  42.                                 tStart = datetime.now()
  43.                                 x = x + 1      
  44.    
  45.                         else:
  46.                                 amount = amount + buf
  47.  
  48. try:
  49.     measure(buf=1000, intervall=3)
  50. except  KeyboardInterrupt:
  51.     exit(0)
Zuletzt geändert von BlackJack am Donnerstag 22. Dezember 2016, 09:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
noisefloor
User
Beiträge: 1529
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Internet Speedtest

Beitragvon noisefloor » Donnerstag 22. Dezember 2016, 08:18

Hallo,

solange du dein Programm hier ohne korrekte Einrückungen postest, kann man eher wenig sagen. Den Code bitte in einen Codeblock setzen, dann werden auch die Einrückungen übernommen.

Außerdem ist es hilfreich, wenn du die _komplette_ Fehlermeldung postest. "Geht nicht" ist wenig hilfreich...

Gruß, noisefloor
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 08:41

Oh Entschuldigung.

Fehler:

  1.   File "./Spee.py", line 32
  2.     while ((len(f.read(buf))==buf) and (x<= 6)):
  3.                                                ^
  4. IndentationError: unindent does not match any outer indentation level


  1. #!/usr/bin/python
  2. import urllib2
  3. import urllib
  4. import time
  5. from datetime import datetime
  6. import subprocess
  7. import sys
  8. import os
  9.  
  10. LON = 0
  11. LAT = 0
  12. # Geschwindigkeit messen
  13. def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
  14.        # try:
  15.                 f = urllib.urlopen(url)
  16.         #except IOError:
  17.        #         subprocess.call(["./Verbindungsaufbau"])
  18. #        exit(0)
  19.  #               print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  20.   #      except IndexError:
  21.    #             print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  22.     #            exit(0)
  23.      #   else:  
  24.                 tStart = datetime.now()
  25.                 amount = 0
  26.                 x = 0
  27.     while ((len(f.read(buf))==buf) and (x<= 6)):
  28.                # LON = 0
  29.                 #LAT = 0
  30.                 try:
  31.                         f = urllib.urlopen(url)
  32.                 except IOError:
  33.                         subprocess.call(["./Verbindungsaufbau"])
  34.                         exit(0)
  35.                         print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
  36.                 else:
  37.                         tEnd = datetime.now()
  38.                         dif = (tEnd - tStart).total_seconds()
  39.                         LAT=sys.argv[1]
  40.                         LON=sys.argv[2]
  41.                         if (dif >= intervall):
  42.                                 print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
  43.                                 amount = 0
  44.                                 tStart = datetime.now()
  45.                                 x = x + 1      
  46.    
  47.                         else:
  48.                                 amount = amount + buf
  49.  
  50. try:
  51.     measure(buf=1000, intervall=3)
  52. except  KeyboardInterrupt:
  53.     exit(0)
Zuletzt geändert von BlackJack am Donnerstag 22. Dezember 2016, 09:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 5260
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Internet Speedtest

Beitragvon Sirius3 » Donnerstag 22. Dezember 2016, 09:49

@Nr8: der Fehler ist doch eindeutig. Einrückungen sind in Python syntaktisch relevant. Du solltest **immer** mit 4 Leerzeichen pro Ebene einrücken und Dir einen Editor suchen, der Blockkommentare beherrscht. Innerhalb der while-Schleife solltest Du nicht versuchen eine neue Verbindung aufzubauen. Das macht keinen Sinn. Und `exit` gehört in keine Funktion. Großgeschriebene Variablennamen sind per Konvention Konstanten, LAT und LON werden aber verändert, und dann noch mit sys.argv, was an dieser Stelle auch überraschend ist. Überraschungen mögen Programmierer nicht. while und if brauchen keine Klammern um die Bedingung. Also weg damit.
Benutzeravatar
BlackJack
Moderator
Beiträge: 31032
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Internet Speedtest

Beitragvon BlackJack » Donnerstag 22. Dezember 2016, 09:57

@Nr8: Die Meldung sagt es doch eigentlich sehr deutlich, die Einrückungstiefe von der ``while``-Schleife passt nicht zu der äusseren Einrückungstiefe. Das ist weder so weit eingerückt wie die Zeilen die zu der Funktion gehören, noch so weit eingerückt wie die Zeilen die nicht mehr zu der Funktion gehören. Und da der Compiler anhand der Einrückungstiefe abliest zu welchem Block Codezeilen gehören sollen, weiss er nicht was er damit anfangen soll.

Einrückungstiefe ist per Konvention übrigens vier Leerzeichen pro Ebene.

Wenn ich mir die Zeilen 18 bis 23 anschaue solltest Du entweder die Funktionen Deines Editors besser kennenlernen oder einen anderen Editor verwenden, denn jeder gute Texteditor bietet die Möglichkeit einen markierten Zeilenblock komplett ein- oder auszukommentieren. Das dürfte schneller und weniger fehleanfällig gehen als das manuell für jede Zeile zu machen.

Kein einziger `exit()`-Aufruf in dem Programm ist wirklich nötig, auch die im auskommentierten Code nicht. Mit dieser Funktion sollte man sehr sparsam umgehen weil das eine recht drastische Vorgehensweise ist, die es schwierig machen kann Veränderungen vorzunehmen, wenn man beispielsweise ein Programm doch nicht beenden möchte, oder eine Funktion verwenden möchte ohne das in bestimmten Fällen gleich das gesamte Programm beendet wird.

Zudem muss das eigentlich ``sys.exit()`` heissen, denn offiziell gibt es die `exit()`-Funktion so gar nicht.

Bei den Bedingungen bei ``while`` und ``if`` sind sämtliche Klammern überflüssig.

`LAT` und `LON` sind wie Konstanten geschrieben, sind aber keine Konstanten. Das die in der `measure()`-Funktion aus den Kommandozeilenargumenten geholt werden, ist ein wenig undurchsichtig.

Und noch mal inhaltlich zum Programm: Der Ablauf macht *so* wenig bis gar keinen Sinn. Ich persönlich würde auch die Zeitmessung und die Ausgabe voneinander trennen.
Interestingly enough, the gods of the Disc have never bothered much about judging the souls of the dead, and so people only go to hell if that's where they think they deserve to go. Which they won't do if they don't know about it. This explains why it is important to shoot missionaries on sight.
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 11:45

Oh Mist.

Ich glaube, dass kriege ich nie so hin.
:?: :?: :?:
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 12:07

Wie würdest du denn die Zeitmessung und die Ausgabe voneinander trennen?
Benutzeravatar
BlackJack
Moderator
Beiträge: 31032
Registriert: Dienstag 25. Januar 2005, 23:29
Wohnort: Berlin
Kontaktdaten:

Re: Internet Speedtest

Beitragvon BlackJack » Donnerstag 22. Dezember 2016, 12:39

@Nr8: Eine Generatorfunktion die die Zeiten liefert, oder eine Funktion als Argument übergeben die einen Messwert zur Ausgabe erwartet. In Python würde ich die Generatorfunktion bevorzugen.
Interestingly enough, the gods of the Disc have never bothered much about judging the souls of the dead, and so people only go to hell if that's where they think they deserve to go. Which they won't do if they don't know about it. This explains why it is important to shoot missionaries on sight.
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 13:00

@BlackJack da bin ich wohl zu blöd für.

Ich verstehe nicht wie das funktionieren soll. :?
Benutzeravatar
Kebap
User
Beiträge: 291
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Re: Internet Speedtest

Beitragvon Kebap » Donnerstag 22. Dezember 2016, 13:50

Als Anfänger würde es wohl ausreichen, das ganze in zwei Funktionen aufzutrennen, und die Ergebnisse jeweils weiterzugeben.
MorgenGrauen: 1 Welt, >12 Gilden, >85 Abenteuer, >1000 Waffen und Rüstungen,
>2500 NPC, >16000 Räume, >170 freiwillige Programmierer, einfach Text, seit 1992.
Nr8
User
Beiträge: 36
Registriert: Mittwoch 21. Dezember 2016, 08:43

Re: Internet Speedtest

Beitragvon Nr8 » Donnerstag 22. Dezember 2016, 13:58

Ich wäre euch auf ewig dankbar, wenn ihr mir sagen könntet wie ich das umsetzen muss.

Ich dachte schon mein bisheriges Ergebnis würde ein tolles Programm sein und ich könnte damit alles umsetzen.
Hab jetz das Gefühl meine Ausführung ist totaler Mist.

:( :( :(
Sirius3
User
Beiträge: 5260
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Internet Speedtest

Beitragvon Sirius3 » Donnerstag 22. Dezember 2016, 14:26

@Nr8: totaler Mist stimmt ja nicht. Die wesentliche Funktionalität hast Du umgesetzt, die Form ergibt sich aus Zeit und Übung.

Mit Generator könnte das z.B. so aussehen:
  1. #!/usr/bin/python
  2. import urllib
  3. import time
  4. from datetime import datetime as DateTime
  5.  
  6. def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, size=10):
  7.     response = urllib.urlopen(url)
  8.     for _ in range(7):
  9.         time_start = time_end = time.time()
  10.         amount = 0
  11.         while time_end - time_start < intervall:
  12.             bytes_read = len(response.read(size))
  13.             if not bytes_read:
  14.                 return
  15.             time_end = time.time()
  16.             amount += bytes_read
  17.         yield amount, time_end - time_start
  18.  
  19. def main():
  20.     try:
  21.         for amount, time_delta in measure(size=1000, intervall=3):
  22.             print "{0:%H:%M:%S}: {1:.3f}Mbit/s".format(DateTime.now(), amount/time_delta * 8 / (1024**2))
  23.     except KeyboardInterrupt:
  24.         pass
  25.    
  26. if __name__ == '__main__':
  27.     main()
Benutzeravatar
Kebap
User
Beiträge: 291
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Re: Internet Speedtest

Beitragvon Kebap » Donnerstag 22. Dezember 2016, 14:54

Nr8 hat geschrieben:Ich wäre euch auf ewig dankbar, wenn ihr mir sagen könntet wie ich das umsetzen muss. :(

Werte aus Funktionen zurückgeben macht man mit `return` - das ist extrem praktisch. (In Generatorfunktionen mit `yield`)

Ich habe gerade PEP 255 gelesen und bin erstaunt, dass es in Python 2.2 nur `return` gab aber keine Expressions danach.
MorgenGrauen: 1 Welt, >12 Gilden, >85 Abenteuer, >1000 Waffen und Rüstungen,
>2500 NPC, >16000 Räume, >170 freiwillige Programmierer, einfach Text, seit 1992.
Sirius3
User
Beiträge: 5260
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Internet Speedtest

Beitragvon Sirius3 » Donnerstag 22. Dezember 2016, 15:09

@Kebap: Rückgabewerte von Generatoren sind ja auch irgendwie ein ziemlich konstruiertes Konstrukt. Ein weiteres Indiz, dass Python3 eine Spielwiese ist und man auf Python 4 warten sollte, dass dann hoffentlich wieder eine ernsthafte Programmiersprache ist.
Benutzeravatar
noisefloor
User
Beiträge: 1529
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: Internet Speedtest

Beitragvon noisefloor » Donnerstag 22. Dezember 2016, 15:18

Hallo,

@Sirius3: Generatoren sind doch mit Python 2.2 eingeführt worden, da war Python 3 noch gar nicht in der Planung (denke ich zumindest...) - ich sage da gerade nicht den von dir genannten Zusammenhang zwischen Generatoren und Python 3.

Gruß, noisefloor

Zurück zu „Netzwerkprogrammierung“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder