Seite 2 von 5
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 11:45
von Nr8
Oh Mist.
Ich glaube, dass kriege ich nie so hin.

Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 12:07
von Nr8
Wie würdest du denn die Zeitmessung und die Ausgabe voneinander trennen?
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 12:39
von BlackJack
@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.
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 13:00
von Nr8
@BlackJack da bin ich wohl zu blöd für.
Ich verstehe nicht wie das funktionieren soll.

Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 13:50
von Kebap
Als Anfänger würde es wohl ausreichen, das ganze in zwei Funktionen aufzutrennen, und die Ergebnisse jeweils weiterzugeben.
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 13:58
von Nr8
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.

Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 14:26
von Sirius3
@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:
Code: Alles auswählen
#!/usr/bin/python
import urllib
import time
from datetime import datetime as DateTime
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, size=10):
response = urllib.urlopen(url)
for _ in range(7):
time_start = time_end = time.time()
amount = 0
while time_end - time_start < intervall:
bytes_read = len(response.read(size))
if not bytes_read:
return
time_end = time.time()
amount += bytes_read
yield amount, time_end - time_start
def main():
try:
for amount, time_delta in measure(size=1000, intervall=3):
print "{0:%H:%M:%S}: {1:.3f}Mbit/s".format(DateTime.now(), amount/time_delta * 8 / (1024**2))
except KeyboardInterrupt:
pass
if __name__ == '__main__':
main()
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 14:54
von Kebap
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.
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 15:09
von Sirius3
@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.
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 15:18
von noisefloor
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
Re: Internet Speedtest
Verfasst: Donnerstag 22. Dezember 2016, 15:34
von Sirius3
@noisefloor: was Kebap meint, ist, dass mit PEP 380 (Python 3.3) `yield from` zusammen mit Rückgabewerten von Generatoren eingeführt wurde. Es gibt also erst ab Python 3.3 ein `return something` wobei man das something normalerweise gar nicht zu sehen bekommt außer man geht einen Generator händisch mit `next` durch und fängt die StopIteration-Exception ab. Dafür, dass der Aufwand, an den Wert zu kommen so groß ist, wäre es deutlich klarer, diesen Umstand im Generator mit `raise StopIteration(something)` deutlich zu machen.
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 07:37
von Nr8
Vielen Dank!
Wenn ich bei laufender Messung den LTE-Stick abziehe stoppt die Ausgabe.
Ist es möglich eine Ausgabe wie Kein Stick oder bei keinem Netz 0 Kbit/s auszugeben?
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 09:01
von Sirius3
@Nr8: Dazu muß man ein/zwei Ebenen tiefer gehen, sich den Socket-Handle geben lasse, mit select mit timeout warten, bis wirklich Daten angekommen sind und diese mit recv lesen.
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 10:17
von Nr8
:K
Mit try: except in der while-schleife geht es nicht oder?
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 10:27
von Sirius3
@Nr8: nein, weil `read` so lange blockiert, bis es die gewünschte Anzahl an Bytes gelesen hat.
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 11:23
von Nr8
Sollte das, "
if not bytes_read:
return
",
das nicht auch abfangen???
Re: Internet Speedtest
Verfasst: Freitag 23. Dezember 2016, 12:00
von noisefloor
Hallo,
nein, weil wie Siriuis3 schon sagt: `read` blockiert, bis die angegebene Anzahl Bytes gelesen ist. Vorher wird die nächste Zeile nicht abgearbeitet.
Gruß, noisefloor
Re: Internet Speedtest
Verfasst: Dienstag 27. Dezember 2016, 06:54
von Nr8
Guten Morgen!
Habt ihr da vielleicht ein gutes Bespiel oder etwas ähnliches?
Ich verstehe einfach nicht wie das funktionieren soll.
Vielen Dank für eure tolle Hilfe!!!
Re: Internet Speedtest
Verfasst: Dienstag 27. Dezember 2016, 10:46
von Sirius3
@Nr8: ein Einstieg wäre die Dokumentation zu
Sockets.
Re: Internet Speedtest
Verfasst: Dienstag 27. Dezember 2016, 13:21
von Nr8
Ok danke!
Gucke ich mir später mal an.
Kann ich den Code von Sirius3 mit GPS-Daten verknüpfen?
Habe eine NAVILOCK GPS Maus.
Kann mir die GPS-Daten auch anzeigen lassen. Ich hätte die Daten aber gern gleichzeitig mit den Datenraten in einer CSV gespeichert.
Code: Alles auswählen
#! /usr/bin/python
import os
from gps import *
from time import *
import time
import threading
gpsd = None #seting the global variable
os.system('clear') #clear the terminal (optional)
class GpsPoller(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
global gpsd #bring it in scope
gpsd = gps(mode=WATCH_ENABLE) #starting the stream of info
self.current_value = None
self.running = True #setting the thread running to true
def run(self):
global gpsd
while gpsp.running:
gpsd.next() #this will continue to loop and grab EACH set of gpsd info to clear the buffer
if __name__ == '__main__':
gpsp = GpsPoller() # create the thread
try:
gpsp.start() # start it up
while True:
#It may take a second or two to get good data
#print gpsd.fix.latitude,', ',gpsd.fix.longitude,' Time: ',gpsd.utc
os.system('clear')
print 'latitude ' , gpsd.fix.latitude
print 'longitude ' , gpsd.fix.longitude
print 'speed (m/s) ' , gpsd.fix.speed
time.sleep(5) #set to whatever
except (KeyboardInterrupt, SystemExit): #when you press ctrl+c
print "\nKilling Thread..."
gpsp.running = False
gpsp.join() # wait for the thread to finish what it's doing
print "Done.\nExiting."