Python 名称错误:名称';海拔高度';没有定义
我有一个gps代码,它获取gps数据并写入日志:Python 名称错误:名称';海拔高度';没有定义,python,Python,我有一个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.WA
#!/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
回溯(最近一次呼叫最后一次):
文件“gps messi.py”,第57行,在
高度=“%f”%(高度),
名称错误:未定义名称“高度”
有趣的是,代码有时工作得非常好,有时它会给我这个错误。我不明白我该怎么做才能让它一直正常工作。它是否和she-bang有关?根据具体情况,会话中的报告似乎没有名为“aighty”的属性。如果属性“alt”存在,它将创建一个可变高度,允许代码工作。如果属性“alt”不存在,代码将失败。在if语句之前启动变量,它将正常工作。根据具体情况,来自会话的报告似乎没有名为“高度”的属性。如果属性“alt”存在,它将创建一个可变高度,允许代码工作。如果属性“alt”不存在,代码将失败。在if语句之前启动变量,它将正常工作。我同意@wesgur您在n
if
语句中启动幅度
,但在某些情况下,如果不满足语句的条件,并且程序没有高度的定义,我同意@我们认为您在nif
语句中启动了ality
,但在某些情况下,如果该语句的条件不满足,并且程序没有定义高度,我猜如果hasattr(report,'alt'):
没有解析为True
,那么
if hasattr(report, 'alt'):
altitude = report.alt
当您到达这里时,将不会为高度分配任何内容
journal.send(
channel = 'gps',
priority = journal.Priority.INFO,
timestamp = "%f" % (timestamp),
latitude = "%f" % (latitude),
longitude = "%f" % (longitude),
altitude = "%f" % (altitude),
)
在分配高度之前,您基本上使用的是高度。为了避免这种情况,您可以先将高度
初始化为某个值,然后再使用
altitude=0
这样做将确保它在使用之前被分配,并且您不应该得到该错误。我的猜测是如果hasattr(report,'alt'):
没有解析为True
,那么
if hasattr(report, 'alt'):
altitude = report.alt
当您到达这里时,将不会为高度分配任何内容
journal.send(
channel = 'gps',
priority = journal.Priority.INFO,
timestamp = "%f" % (timestamp),
latitude = "%f" % (latitude),
longitude = "%f" % (longitude),
altitude = "%f" % (altitude),
)
在分配高度之前,您基本上使用的是高度。为了避免这种情况,您可以先将高度
初始化为某个值,然后再使用
altitude=0
这样做将确保在使用之前分配该块,并且您不应该得到该错误。移动该块
timestamp = (time.time()*1000)
latitude = 0
longitude = 0
altitude = 0
在if报告['class']='TPV'之前:
branch。
因此,您将始终初始化四个变量。移动块
timestamp = (time.time()*1000)
latitude = 0
longitude = 0
altitude = 0
在if报告['class']='TPV'之前:
branch。
因此,您将始终初始化四个变量。非常感谢大家。这就是我的代码现在的样子。我试过了,看起来不错。但如果我还在滑倒,有人能检查一下行日志的缩进吗?如果我所做的是正确的(我修改了一些变量的名称并增加了速度):
谢谢大家。这就是我的代码现在的样子。我试过了,看起来不错。但如果我还在滑倒,有人能检查一下行日志的缩进吗?如果我所做的是正确的(我修改了一些变量的名称并增加了速度):
在尝试格式化字符串之前,应始终检查是否定义了变量。当您试图从库中获取变量时,您无法保证该变量将被定义。可能是输入错误if hasatr(报告“alt”):
应该是hasattr
?顺便说一句,您的else
只属于最后一个if
。如果没有速度属性,为什么要覆盖以前指定的时间戳、纬度、经度和高度?此代码似乎存在很多缩进问题。如果存在,为什么要忽略报告时间?在尝试格式化字符串之前,应始终检查变量是否已定义。当您试图从库中获取变量时,您无法保证该变量将被定义。可能是输入错误if hasatr(报告“alt”):
应该是hasattr
?顺便说一句,您的else
只属于最后一个if
。如果没有速度属性,为什么要覆盖以前指定的时间戳、纬度、经度和高度?这段代码似乎有很多缩进问题。如果存在,为什么要忽略report.time
?在if语句之前初始化变量或全局初始化变量?如果报告['class']=='TPV'
为真,但没有属性“alt”
,该怎么办<代码>高度
在当前代码中保持未初始化状态,正如您已经看到的。是的,我知道了。但是我应该在哪里初始化呢?在if或GLOBALLY之前更好?我不认为在这种情况下会有任何区别。那么哪个更好?在if语句之前初始化变量或全局初始化变量?如果报告['class']=='TPV'
为真,但没有属性“alt”
,该怎么办<代码>高度
在当前代码中保持未初始化状态,正如您已经看到的。是的,我知道了。但是我应该在哪里初始化呢?在if或GLOBALLY更好之前?我不认为在这种情况下会有任何区别。非常感谢Matt。那么哪一个更好呢?在if语句之前初始化变量还是全局初始化变量?我认为在if语句之前初始化就足够了。可能就在分配了report
之后。事实上,对于jou中使用的所有变量,您可能都应该这样做