Hallo Zusammen,
weiß jemand, wie ich einen Inernet Speedtest per Programmcode machen könnte ?
Downloadlink & Uplink
Oder gibt da schon was?
Vielen Dank
Internet Speedtest
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Etwas mit bekannter größe runterladen und schauen wie lange es gedauert hat, und analog auch hochladen. Und zum Runter- und Hochladen am besten ein CDN verwenden, so dass immer schnelle Edge-Server in der Nähe des Users stehen. Ich hab hier eine ca. 3 MB/s-Anbindung, aber einige Sachen tröpfeln nur mit 200 Kbyte/s rein, sowas vereitelt die "Messung".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 102
- Registriert: Montag 28. März 2011, 07:50
Danke für die Antwort. Sowas habe ich schon geschrieben. Weiß aber nicht, ob meine Messung so wirklich stimmt. Ich habe mal eine kleine Datei heruntergeladen und eine größere. Dieser Werte unterscheiden sich aber extrem ;(
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Grundsätzlich kann so ein Speedtest eigentlich nur die aktuelle Geschwindigkeit zwischen einem selbst und dem genutzten Server aufzeigen. Dazwischen sind allerdings auch noch einige Zwischenstationen... Somit kann man die tatsächliche Verbindungsgeschwindigkeit nicht wirklich zuverlässig ermitteln.
Also egal wie man es macht, es ist nur ein Näherungswert und einem Momentaufnahme...
Schau dir mal an, wie es http://www.wieistmeineip.de/speedtest/ macht. Ich hab es mal mit Firebug beobachtet:
Es wird eine Anfrage wie http://speedtest-smk.wieistmeineip.de/u ... hp?size=64 per GET an den Server geschickt. Der liefert dann eine HTML Seite mit einer Formular zurück. In einem versteckten Feld sind anscheinend Zufallsdaten mit entsprechender Größe. Das Formular wird dann wieder per POST an den Server gesendet.
Mit Javascript werden die Zeiten aufaddiert.
Irgendwie nicht sonderlich kompliziert. Der JS Code ist auch recht leserlich und nachvollziehbar. Wäre IMHO nicht all zu viel Arbeit das nach zu bauen.
Aber wozu eigentlich?
Also egal wie man es macht, es ist nur ein Näherungswert und einem Momentaufnahme...
Schau dir mal an, wie es http://www.wieistmeineip.de/speedtest/ macht. Ich hab es mal mit Firebug beobachtet:
Es wird eine Anfrage wie http://speedtest-smk.wieistmeineip.de/u ... hp?size=64 per GET an den Server geschickt. Der liefert dann eine HTML Seite mit einer Formular zurück. In einem versteckten Feld sind anscheinend Zufallsdaten mit entsprechender Größe. Das Formular wird dann wieder per POST an den Server gesendet.
Mit Javascript werden die Zeiten aufaddiert.
Irgendwie nicht sonderlich kompliziert. Der JS Code ist auch recht leserlich und nachvollziehbar. Wäre IMHO nicht all zu viel Arbeit das nach zu bauen.
Aber wozu eigentlich?
Hi,
ich benutze folgendes Programm um mir alle zwei Sekunden die Datenrate ausgeben zu lassen.
Sobald meine Internetverbindung abbricht erhalte ich folgenden Fehler.
Traceback (most recent call last):
File "./peedneu.py", line 43, in <module>
measure (buf=1024, intervall=2)
File "./Speedneu.py", line 18, in measure
f = urllib2.urlopen(url)
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1227, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno -2] Name or service not known>
Ich würde aber gern eine Ausgabe mit 0Mbit/s haben, bis meine die Downloadrate wieder berechnet werden kann.
Kennt da irgendwer eine Lösung für mein Problem.
ich benutze folgendes Programm um mir alle zwei Sekunden die Datenrate ausgeben zu lassen.
Code: Alles auswählen
#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import sys
import os
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=2, buf=10):
f = urllib2.urlopen(url)
tStart = datetime.now()
amount = 0
x = 0
while ((len(f.read(buf))==buf) & (x<= 60)):
tEnd = datetime.now()
dif = (tEnd - tStart).total_seconds()
if (dif >= intervall):
# print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;"
amount = 0
tStart = datetime.now()
x = x + 1
else:
amount = amount + buf
try:
measure (buf=1024, intervall=2)
except KeyboardInterrupt:
exit(0)
Sobald meine Internetverbindung abbricht erhalte ich folgenden Fehler.
Traceback (most recent call last):
File "./peedneu.py", line 43, in <module>
measure (buf=1024, intervall=2)
File "./Speedneu.py", line 18, in measure
f = urllib2.urlopen(url)
File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 431, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 449, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 409, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1227, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1197, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno -2] Name or service not known>
Ich würde aber gern eine Ausgabe mit 0Mbit/s haben, bis meine die Downloadrate wieder berechnet werden kann.
Kennt da irgendwer eine Lösung für mein Problem.
Zuletzt geändert von Anonymous am Mittwoch 21. Dezember 2016, 09:48, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@Nr8: Die Einrückung in dem Quelltext ist kaputt‽
Die Lösung dürfte mit der Behandlung dieser Ausnahme in Deinem Code zu tun haben.
Die Lösung dürfte mit der Behandlung dieser Ausnahme in Deinem Code zu tun haben.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das bit-weise `&` in der `while` Schleife ist wohl auch falsch... da soll doch wohl an `and` hin, oder?
Gruß, noisefloor
das bit-weise `&` in der `while` Schleife ist wohl auch falsch... da soll doch wohl an `and` hin, oder?
Gruß, noisefloor
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
das das `&` an der Stelle funktioniert liegt auch nur daran, dass z.B. `True & True` das gleiche Ergebnis gibt wie `True and True`. Richtig ist bit-weise Operation trotzdem an der Stelle nicht.
Ansonsten hat BlackJack doch schon das Stichwort gegeben: Exception-Handling der betreffenden Zeile, in der der Fehler auftritt.
Gruß, noisefloor
das das `&` an der Stelle funktioniert liegt auch nur daran, dass z.B. `True & True` das gleiche Ergebnis gibt wie `True and True`. Richtig ist bit-weise Operation trotzdem an der Stelle nicht.
Ansonsten hat BlackJack doch schon das Stichwort gegeben: Exception-Handling der betreffenden Zeile, in der der Fehler auftritt.
Gruß, noisefloor
@Nr8: Zum Ausführen von externen Programmen gibt es das `subprocess`-Modul in der Standardbibliothek.
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:
Code:
Code: Alles auswählen
#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os
LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
# try:
f = urllib.urlopen(url)
#except IOError:
# subprocess.call(["./Verbindungsaufbau"])
# exit(0)
# print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
# except IndexError:
# print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
# exit(0)
# else:
tStart = datetime.now()
amount = 0
x = 0
while ((len(f.read(buf))==buf) and (x<= 6)):
try:
f = urllib.urlopen(url)
except IOError:
subprocess.call(["./Verbindungsaufbau"])
exit(0)
print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
else:
tEnd = datetime.now()
dif = (tEnd - tStart).total_seconds()
LAT=sys.argv[1]
LON=sys.argv[2]
if (dif >= intervall):
print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
amount = 0
tStart = datetime.now()
x = x + 1
else:
amount = amount + buf
try:
measure(buf=1000, intervall=3)
except KeyboardInterrupt:
exit(0)
Zuletzt geändert von Anonymous am Donnerstag 22. Dezember 2016, 09:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
- noisefloor
- User
- Beiträge: 3854
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
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
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
Oh Entschuldigung.
Fehler:
[codebox=text file=Unbenannt.txt] File "./Spee.py", line 32
while ((len(f.read(buf))==buf) and (x<= 6)):
^
IndentationError: unindent does not match any outer indentation level
[/code]
Fehler:
[codebox=text file=Unbenannt.txt] File "./Spee.py", line 32
while ((len(f.read(buf))==buf) and (x<= 6)):
^
IndentationError: unindent does not match any outer indentation level
[/code]
Code: Alles auswählen
#!/usr/bin/python
import urllib2
import urllib
import time
from datetime import datetime
import subprocess
import sys
import os
LON = 0
LAT = 0
# Geschwindigkeit messen
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=3, buf=10):
# try:
f = urllib.urlopen(url)
#except IOError:
# subprocess.call(["./Verbindungsaufbau"])
# exit(0)
# print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
# except IndexError:
# print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
# exit(0)
# else:
tStart = datetime.now()
amount = 0
x = 0
while ((len(f.read(buf))==buf) and (x<= 6)):
# LON = 0
#LAT = 0
try:
f = urllib.urlopen(url)
except IOError:
subprocess.call(["./Verbindungsaufbau"])
exit(0)
print time.strftime("%H:%M:%S; "), "0 Mbit/s;", LAT ,";" , LON
else:
tEnd = datetime.now()
dif = (tEnd - tStart).total_seconds()
LAT=sys.argv[1]
LON=sys.argv[2]
if (dif >= intervall):
print (time.strftime("%H:%M:%S; ")),((((amount/intervall)/1000.00)*8)/1024), "Mbit/s;", LAT ,";" , LON
amount = 0
tStart = datetime.now()
x = x + 1
else:
amount = amount + buf
try:
measure(buf=1000, intervall=3)
except KeyboardInterrupt:
exit(0)
Zuletzt geändert von Anonymous am Donnerstag 22. Dezember 2016, 09:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@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.
@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.
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.