【问题标题】:Python program runs for a week, then fails mysteriouslyPython程序运行了一周,然后神秘地失败了
【发布时间】: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 还是很陌生,所以这不会立即对我产生影响。
你能看出是什么问题吗?
您会在此程序中进行哪些更改以防止这种情况发生?

【问题讨论】:

    标签: python python-2.7 raspberry-pi crash


    【解决方案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。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多