У меня есть этот код gps, который получает данные gps и записывает в журнал:
#!/usr/bin/python
from systemd import journal
import gps
import time
import threading
import datetime
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next() # Wait for a 'TPV' report and display
the current time
# To see all report data, uncomment the line below
#print report
if report['class'] == 'TPV':
if hasattr(report, 'time'):
timestamp = (time.time()*1000)
#print timestamp
if hasattr(report, 'lat'):
latitude = report.lat
#print latitude
if hasattr(report, 'lon'):
longitude = report.lon
#print longitude
if hasattr(report, 'alt'):
altitude = report.alt
#print altitude
else:
timestamp = (time.time()*1000)
latitude = 0
longitude = 0
altitude = 0
journal.send(
channel = 'gps',
priority = journal.Priority.INFO,
timestamp = "%f" % (timestamp),
latitude = "%f" % (latitude),
longitude = "%f" % (longitude),
altitude = "%f" % (altitude),
)
except KeyError:
pass
except KeyboardInterrupt:
quit()
except StopIteration:
session = None
print "GPSD has terminated"
И я получаю эту ошибку:
Traceback (most recent call last):
File "gps-messi.py", line 57, in <module>
altitude = "%f" % (altitude),
NameError: name 'altitude' is not defined
Смешная часть - это код, который отлично работает отлично, и иногда он дает мне эту ошибку. Я не могу понять, что я должен сделать, чтобы он работал правильно все время. Это имеет какое-то отношение к ней?
Я предполагаю, что if hasattr(report, 'alt'):
не разрешает True
, тогда
if hasattr(report, 'alt'):
altitude = report.alt
не будет присваивать что-либо altitude
и там, когда вы доберетесь досюда
journal.send(
channel = 'gps',
priority = journal.Priority.INFO,
timestamp = "%f" % (timestamp),
latitude = "%f" % (latitude),
longitude = "%f" % (longitude),
altitude = "%f" % (altitude),
)
вы по существу используете altitude
прежде чем она будет назначена. Чтобы этого избежать, вы можете инициализировать altitude
до некоторой величины, прежде чем перейти к этой точке с помощью
altitude=0
Это позволит убедиться, что оно назначено до его использования, и вы не должны получать эту ошибку.
report
.
Кажется, что отчет из сеанса не имеет атрибута с именем "высота" в зависимости от случаев. Если атрибут "alt" существует, он создает переменную высоту, позволяющую коду работать. Если атрибут "alt" не существует, код не будет работать. Инициируйте переменные перед операторами if, и он будет работать нормально.
Я согласен с @wesgur вы инициируя alititude
в if
statemtent, но бывают ситуации, когда, что if
выражение условия не будут выполнены, и программа не имеет определение altitude
Переместить блок
timestamp = (time.time()*1000)
latitude = 0
longitude = 0
altitude = 0
before if report['class'] == 'TPV':
branch. Таким образом, вы всегда будете инициализированы четырьмя переменными.
if report['class'] == 'TPV'
равен true, но нет атрибута "alt"
? altitude
остается неинициализированной в вашем текущем коде, как вы уже видели.
Большое спасибо всем. Вот как выглядит мой код сейчас. Я тестировал его, и это кажется прекрасным. Но в случае, если я все еще что-то сползаю, может кто-то просто проверить отступы строки journal.send? Если то, что я сделал правильно (я изменил имена некоторых переменных и добавил скорость):
#!/usr/bin/python
from systemd import journal
import gps
import time
import threading
import datetime
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
while True:
try:
report = session.next() # Wait for a 'TPV' report and display the current time
# To see all report data, uncomment the line below
#print report
timestamp = 0
latitude = 0
longitude = 0
altitude = 0
speed = 0
if report['class'] == 'TPV':
if hasattr(report, 'time'):
timestamp = (time.time()*1000)
#print timestamp
if hasattr(report, 'lat'):
latitude = report.lat
#print latitude
if hasattr(report, 'lon'):
longitude = report.lon
#print longitude
if hasattr(report, 'alt'):
altitude = report.alt
#print altitude
if hasattr(report, 'speed'):
speed = report.speed
#print speed
journal.send(
channel = 'gps',
priority = journal.Priority.INFO,
timestamp = "%f" % (timestamp),
lat_deg = "%f" % (latitude),
lon_deg = "%f" % (longitude),
alt_m = "%f" % (altitude),
speed_mps = "%f" % (speed),
)
except KeyError:
pass
except KeyboardInterrupt:
quit()
except StopIteration:
session = None
print "GPSD has terminated"
if hasatr(report, 'alt'):
должно бытьhasattr
?