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

tom*_*xus 2 python crash python-2.7 raspberry-pi

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

这是为了在我的覆盆子pi上开一个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
Run Code Online (Sandbox Code Playgroud)

它将正常运行一天或一周,然后失败,如下所示:

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    
Run Code Online (Sandbox Code Playgroud)

经过一些研究(主要是SE),我的猜测是,当它失败时,它是因为str().split(".")只返回了一个值,程序需要两个.也许如果它不幸落在第二个边界上,小数点后面没有任何东西?

如果重要,那就是Python 2.7.

我对Python很陌生,所以这并没有立刻向我跳出来.
你能看出问题所在吗?
为了防止这种情况,你会在这个程序中改变什么?

Sel*_*cuk 7

当微秒为零(是的,这可能偶尔会出现一次)时,在字符串表示中没有秒数.

您可以使用Python日期/时间属性而不是解析字符串表示:

from datetime import datetime
time = datetime.now().time()
hour, min, sec, micro = time.hour, time.minute, time.second, time.microsecond
Run Code Online (Sandbox Code Playgroud)

如果必须使用零填充(02而不是2)字符串,则可以使用字符串格式:

hour, min, sec, micro = '{:02d}'.format(time.hour), '{:02d}'.format(time.minute), '{:02d}'.format(time.second), '{:06d}'.format(time.microsecond)
Run Code Online (Sandbox Code Playgroud)