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

Python程序运行了一周,然后神秘地失败了,python,python-2.7,raspberry-pi,crash,Python,Python 2.7,Raspberry Pi,Crash,我有一个正常运行的python程序,但很长一段时间后失败了,我不明白为什么会发生这种情况 这是在我的覆盆子圆周率上驱动一个PiGlow板。 没有更好的办法,我让它以二进制格式显示时间,带有clock.py,由制造商提供,用于演示电路板 代码如下所示: from pyglow import PyGlow from datetime import datetime pyglow = PyGlow() while True: time = datetime.now().time()

我有一个正常运行的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    
它将正常运行一天或一周,然后失败,如下所示:

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    
pi@pi~/pyglow$sudo python clock.py
回溯(最近一次呼叫最后一次):
文件“clock.py”,第37行,在
秒,微=str(秒)。分割(“.”)
ValueError:需要超过1个值才能解包
经过一些研究(主要是在SE上),我的猜测是,当它失败时,这是因为
str().split(“.”
只返回一个值,而程序预期返回两个值。也许是因为运气不好,降落在第二个边界上,小数点后什么也没有

如果这很重要的话,那就是Python2.7

我对Python非常陌生,所以这不会立即引起我的注意。
你能看出问题出在哪里吗?

为了防止出现这种情况,您会对此程序进行哪些更改?

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

您可以使用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)

通过这样做来阻止这种情况的发生

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)
当你在没有微秒的情况下精确到第二秒时,就会发生这种情况。因此,如果您检查“.”,如果您没有找到它,请将micro设置为0

还有一些打印语句来展示它是如何工作的


诚然,最好始终将时间值视为数字,并且不使用字符串。

是的,这是因为你得到的是没有任何毫秒的完整秒数。在更好的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
>>为True时:
...     time=datetime.now().time()
...     小时,分钟,秒=str(时间).split(“:”)
...     尝试:
...         秒,微=str(秒)。分割(“.”)
...     除值错误外:
...         打印str(时间)
...         提升
...
23:08:23
回溯(最近一次呼叫最后一次):
文件“”,第5行,在
ValueError:需要超过1个值才能解包
除了其他答案(Selcuk的答案似乎更好),您可以保护您的陈述,但有一个例外:

try:
    sec, micro = str(sec).split('.')
except ValueError as e:
    sec, micro = sec, '0'

谢谢+谢谢你给我演示