我有一个正常运行的python程序,经过很长一段时间后失败,我不明白为什么会发生这种情况。
这是为了在我的树莓派上开一个PiGlow板
没有更好的处理方法,我让它以二进制格式显示时间,由制造商提供的clock.py来演示电路板。
代码如下所示:
from pyglow import PyGlow
from datetime import datetime
pyglow = PyGlow()
while True:
time = datetime.now().time()
hour,min,sec = str(time).split(":")
sec,micro = str(sec).split(".")
# do stuff with the hour, min, sec, write them to the LEDs
# that's all, no delay or anything else, so the loop runs like crazy
它将正常运行一天或一周,然后失败,如下所示:
pi@pi ~/pyglow $ sudo python clock.py
Traceback (most recent call last):
File "clock.py", line 37, in <module>
sec,micro = str(sec).split(".")
ValueError: need more than 1 value to unpack
经过一些研究(主要是在SE上),我的猜测是,当它失败时,它是因为str().split(".")
只返回了一个值,程序需要两个。或许,如果不幸的是,在小数点之后没有任何东西就落在第二个边界上?
如果重要,那就是Python 2.7。
我对Python很陌生,所以这并没有立刻向我跳出来 你能看出问题所在吗? 为了防止这种情况,你会在这个程序中改变什么?
答案 0 :(得分:6)
当微秒为零时(是的,这可能偶尔会出现一次),你在字符串表示中没有一个点。
您可以使用Python日期/时间属性,而不是解析字符串表示:
from datetime import datetime
time = datetime.now().time()
hour, min, sec, micro = time.hour, time.minute, time.second, time.microsecond
如果必须填充零(02而不是2)字符串,则可以使用字符串格式:
hour, min, sec, micro = '{:02d}'.format(time.hour), '{:02d}'.format(time.minute), '{:02d}'.format(time.second), '{:06d}'.format(time.microsecond)
答案 1 :(得分:1)
是的,它正在发生,因为你在没有任何毫秒的情况下获得满秒。在更好的CPU上,几秒钟后就会出现此错误。
>>> while True:
... time = datetime.now().time()
... hour,min,sec = str(time).split(":")
... try:
... sec,micro = str(sec).split(".")
... except ValueError:
... print str(time)
... raise
...
23:08:23
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
ValueError: need more than 1 value to unpack
答案 2 :(得分:1)
除了其他答案(塞尔丘克的回答似乎更好),您可以保护您的陈述,但有例外:
try:
sec, micro = str(sec).split('.')
except ValueError as e:
sec, micro = sec, '0'
答案 3 :(得分:0)
通过这样做来阻止这种情况发生
from datetime import datetime
while True:
time = datetime.now().time()
hour,min,sec = str(time).split(":")
print sec
if '.' in sec:
sec,micro = str(sec).split(".")
else:
micro = 0
print 'sec=%s micro=%s' % (sec, micro)
当您在没有微秒的情况下达到精确的秒数时会发生这种情况。因此,如果你检查&#39;。&#39;如果你没有找到它将微观设置为0。
其中的一些印刷陈述也表明它是如何运作的。
不可否认,最好只将时间值视为数字,并将字符串保留在其中。