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

Posted

技术标签:

【中文标题】Python程序运行了一周,然后神秘地失败了【英文标题】:Python program runs for a week, then fails mysteriously 【发布时间】:2015-05-15 06:33:04 【问题描述】:

我有一个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 还是很陌生,所以这不会立即对我产生影响。 你能看出是什么问题吗? 您会在此程序中进行哪些更改以防止这种情况发生?

【问题讨论】:

【参考方案1】:

当微秒为 0 时(是的,偶尔会出现这种情况),您在秒的字符串表示中没有点。

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

【讨论】:

【参考方案2】:

除了其他答案(Selcuk 的答案似乎更好)之外,您可以通过例外保护您的陈述:

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

【讨论】:

【参考方案3】:

是的,它正在发生,因为您在没有任何毫秒的情况下获得了整整一秒。在更好的 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

【讨论】:

谢谢! +1 为我展示它【参考方案4】:

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

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)

当你达到没有微秒的精确秒时就会发生这种情况。因此,如果您检查“。”如果您没有找到它,请将其设置为 0。

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

诚然,最好将时间值从始至终都视为数字,并避免使用字符串。

【讨论】:

以上是关于Python程序运行了一周,然后神秘地失败了的主要内容,如果未能解决你的问题,请参考以下文章

CORS 预检神秘地因大猩猩/处理程序而失败

git-apply 神秘地失败了,我该如何排除/修复?

代码神秘地停止工作[关闭]

GROUP BY 子句在 IBM dashDB 中神秘地失败

Python 3.5学习笔记(第一周)

一个智障安装了一天的python和graphlab的血泪史