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程序运行了一周,然后神秘地失败了的主要内容,如果未能解决你的问题,请参考以下文章