Python程序运行了一周,然后神秘地失败了
我有一个正常运行的python程序,但很长一段时间后失败了,我不明白为什么会发生这种情况 这是在我的覆盆子圆周率上驱动一个PiGlow板。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()
没有更好的办法,我让它以二进制格式显示时间,带有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'
谢谢+谢谢你给我演示