Python程序运行一周,然后神秘失败

时间:2015-03-12 21:56:49

标签: python crash raspberry-pi

我有一个正常运行的python程序,经过很长一段时间后失败,我不明白为什么会发生这种情况。

这是为了在我的树莓派上开一个PiGlow板 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很陌生,所以这并没有立刻向我跳出来 你能看出问题所在吗? 为了防止这种情况,你会在这个程序中改变什么?

4 个答案:

答案 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。

其中的一些印刷陈述也表明它是如何运作的。

不可否认,最好只将时间值视为数字,并将字符串保留在其中。