@Nr8: `gpsd` und `gpsp` sind sich sehr ähnliche kryptische Abkürzungen die mich zumindest mindestens einmal beim lesen durcheinander gebracht haben. ``global`` hat in sauberen Programmen nichts zu suchen und Funktionen und Methoden sollten nichts mit Werten machen (ausser Konstanten) die sie nicht als Argumente übergeben bekommen haben. Deine Klasse ist *so* verdammt *keine* Klasse. Klassen sollen Daten kapseln und nicht sowohl ausserhalb Werte neu zuweisen und dann auch noch auf dem eigenen, modulglobalen Exemplar etwas machen. Das kann man ohne so eine ”Klasse” weniger verworren ausdrücken und *mit* einer *echten* Klasse, wahrscheinlich nachvollziehbarer.
Bei Programmen die den Terminalinhalt ungefragt löschen, bekommen viele Benutzer übrigens Hassgefühle. Üblicherweise geht man nämlich davon aus das die Sachen dort stehen bleiben und man da später nochmal im Terminalpuffer hochscrollen kann und nachlesen kann was da steht.
In der ersten Zeile das Leerzeichen zwischen #! und /usr… gehört dort nicht hin.
Sternchenimporte sollte man vermeiden. Damit holt man sich alle Namen aus einem Modul in den aktuellen Modulnamensraum. Weisst Du welche das bei `gps` und `time` sind? Sind die alle unterschiedlich? Und verdecken auch keine eingebauten Namen? Könntest Du bei einem grösseren Programm bei mehreren Sternchenimporten sagen wo welcher Name ursprünglich her kommt?
Zur Frage: Ja man kann Code schreiben der mit Hilfe des `gps`-Moduls die aktuelle Position erfragt und mit in die Messdaten aufnimmt. Dazu müsste man sich überlegen wie man *sinnvoll* eine Klasse schreibt von der man die aktuellen Daten erfragen kann, und dann beispielsweise in der Schleife in der Hauptfunktion von Sirius3's Programm vor jeder Ausgabe auch die Koordinaten abfragt und mit ausgibt.
Internet Speedtest
@Nr8: wenn Du keinen Ansatz findest, solltest Du nochmal ein paar Schritte zurück gehen, und anfangen die Grundlagen von Python zu lernen. Einfach irgendwelchen Code aus dem Internet zusammenzukopieren und dann zu hoffen, dass irgendjemand ein fertiges Programm daraus macht, funktioniert nicht. Was für einen Ansatz brauchst Du denn?
Ich versteh nicht ganz wie ich das mit dem return mache.
Wenn ich eine Funktion z.B.
gebe ich die Werte so richtig zurück?
Wenn ich eine Funktion z.B.
Code: Alles auswählen
from gps Import*
session =gps()
session.stream(WATCh_ENABLE|WATCH_NEWSTYLE)
def position():
lat = 0
lon = 0
while True:
report=session.next()
if report.keys()[0]=='exp' :
lat = float(report['lat'])
lon = float(report['lon'])
return lat, lon
Zuletzt geändert von Anonymous am Mittwoch 4. Januar 2017, 09:56, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du bekommst so auf jeden Fall `lat` und `lon` zurück. Entweder beide mit 0 oder beide mit einen Wert, wenn `if report.keys()[0]=='exp'` True ist.
Das `while True` macht aber so keine Sinn, weil der folgende Codeblock immer nur 1x durchlaufen wird, weil das `return` am Ende auf jeden Fall erreicht wird. Bist du sicher, dass die Einrückungen so korrekt sind wie hier gepostet?
Gruß, noisefloor
du bekommst so auf jeden Fall `lat` und `lon` zurück. Entweder beide mit 0 oder beide mit einen Wert, wenn `if report.keys()[0]=='exp'` True ist.
Das `while True` macht aber so keine Sinn, weil der folgende Codeblock immer nur 1x durchlaufen wird, weil das `return` am Ende auf jeden Fall erreicht wird. Bist du sicher, dass die Einrückungen so korrekt sind wie hier gepostet?
Gruß, noisefloor
@Nr8: *-Importe sind schlecht und »import« schreibt man klein. Eingerückt wird immer mit 4 Leerzeichen pro Ebene und nicht mal mit 3 und mal mit 6. Wörterbücher sind ungeordnet. Dass der erste Schlüssel »exp« heißt, ist rein zufällig. Korrekt wäre »if 'exp' in report«. »exp« kommt da aber nie vor, höchstens »epx«, aber warum prüfst Du nicht gleich auf das Vorhandensein von »lat« oder »lon«?
Du willst ja zwei Dinge parallel machen, die Geschwindigkeit einer Verbindung testen und den Ort bestimmen. Ich weiß jetzt nicht, ob die next Methode instantan Werte liefert, ob Du den letzten gültigen Wert benutzen willst, oder warten willst, bis die nächste gültige Postion geliefert wird.
Für den Fall, dass man mit dem letzten gültigen Wert arbeiten will:
Du willst ja zwei Dinge parallel machen, die Geschwindigkeit einer Verbindung testen und den Ort bestimmen. Ich weiß jetzt nicht, ob die next Methode instantan Werte liefert, ob Du den letzten gültigen Wert benutzen willst, oder warten willst, bis die nächste gültige Postion geliefert wird.
Für den Fall, dass man mit dem letzten gültigen Wert arbeiten will:
Code: Alles auswählen
def get_latest_position(gps_session, last_position):
position = last_position
while gps_session.waiting():
data = next(gps_session)
if 'lat' in data:
position = (data['lat'], data['lon'])
return position
@Nr8: Nein, das ist ja auch der Rückgabewert. Den musst Du ausgeben. Gegebenenfalls vorher in der `main()` an einen lokalen Namen binden. Vergiss das es ``global`` gibt.
@Nr8: An Stelle der Fragezeichen musst Du natürlich noch die GPS-Sitzung und einen passenden Wert für die letzte Position übergeben. Zum Beispiel `None`, oder ein Tupel mit jeweils `None` für Länge und Breite, oder… — das kommt darauf an wie Du beim Aufrufer mit diesem Fall umgehen möchtest das die Funktion keine neue Position ermitteln kann.
@Nr8: Ja. Weil Du *einen* Wert ausgibst, nämlich das Tupel. Und Tupel werden in der Zeichenkettendarstellung mit runden Klammern repräsentiert. Wenn Du die Werte *in* dem Tupel anders darstellen möchtest, dann musst Du das explizit selber tun. Also selbst eine Zeichenkette erstellen die die beiden Werte so enthält wie Du sie gerne hättest. Das geht beispielsweise mit der `format()`-Methode auf Zeichenketten.
habe die Daten jetzt ganz einfach getrennt indem ich " lat, lon = latlon geschrieben habe.
Bekomme leider manchmal eine Fehlermeldung.
Traceback (most recent call last):
File "./vartest.py", line 67, in <module>
main()
File "./vartest.py", line 52, in main
lat, lon = latlon
ValueError: too many values to unpack
habe mir latlon mal ausgeben lassen und da kommt manchmal als Ausgabe
Time: (nan)
Lat/Lon: 0.000000 0.000000
Altitude: ?
Speed: ?
Track: ?
Status: STATUS_NO_FIX
Mode: MODE_NO_FIX
Quality: 0 p=0.00 h=0.00 v=0.00 t=0.00 g=0.00
Y: 0 satellites in view:
Habt ihr nen Plan wie ich den Fehler umgehen kann und warum der Fehler kommt?
Bekomme leider manchmal eine Fehlermeldung.
Traceback (most recent call last):
File "./vartest.py", line 67, in <module>
main()
File "./vartest.py", line 52, in main
lat, lon = latlon
ValueError: too many values to unpack
habe mir latlon mal ausgeben lassen und da kommt manchmal als Ausgabe
Time: (nan)
Lat/Lon: 0.000000 0.000000
Altitude: ?
Speed: ?
Track: ?
Status: STATUS_NO_FIX
Mode: MODE_NO_FIX
Quality: 0 p=0.00 h=0.00 v=0.00 t=0.00 g=0.00
Y: 0 satellites in view:
Habt ihr nen Plan wie ich den Fehler umgehen kann und warum der Fehler kommt?
Zuletzt geändert von Nr8 am Donnerstag 5. Januar 2017, 10:58, insgesamt 1-mal geändert.
Code: Alles auswählen
#!/usr/bin/python
import urllib
import time
from datetime import datetime as DateTime
import subprocess
import sys
import os
from gps import*
session =gps()
session.stream(WATCH_ENABLE|WATCH_NEWSTYLE)
def get_latest_position(gps_session, last_position):
position = last_position
while gps_session.waiting():
data = next(gps_session)
if 'lat' in data:
position = (data['lat'], data['lon'], data['speed'])
return position
def measure(url="http://www.speedtestx.de/testfiles/data_500mb.test", intervall=2, size=10):
response = urllib.urlopen(url)
for _ in range(1):
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=2):
latlonspeed = get_latest_position(session, session)
lat, lon, speed = latlonspeed
print "{0:%H:%M:%S}; {1:.3f};".format(DateTime.now(), amount/time_delta / 1024), ";", lat, ";" , lon, ";", speed
lon = 0
lat = 0
speed = 0
time.sleep(2)
except IndexError:
return
except IOError:
return
if __name__ == '__main__':
main()
Zuletzt geändert von Anonymous am Donnerstag 5. Januar 2017, 11:10, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
@Nr8: Bei `get_latest_position()` wird als zweites Argument ja auch nicht die letzte bekannte Position übergeben, sondern völlig unsinnigerweise nochmal das `session`-Objekt. Das übrigens auch nicht auf Modulebene definiert werden sollte, sondern in die Hauptfunktion gehört.