在 Raspberry Pi 上使用 Python 获得系统正常运行时间
get system uptime with Python on a Raspberry Pi
这个问题是指:
如果我在树莓派上使用程序,我会得到错误的时间:
~ $ uname -a
Linux raspberry 5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l GNU/Linux
pi@raspberry:~ $ uptime
15:14:33 up 20 min, 3 users, load average: 0,00, 0,08, 0,09
但输出是:
20 0 1 # days, hours, minutes
我正在使用:
import subprocess
def uptime1(): # liefert Zeit in s
raw = subprocess.check_output('uptime').decode("utf8").replace(',', '')
days = int(raw.split()[2])
if 'min' in raw:
hours = 0
minutes = int(raw[4])
else:
hours, minutes = map(int,raw.split()[4].split(':'))
print(days, hours, minutes)
totalsecs = ((days * 24 + hours) * 60 + minutes) * 60
return totalsecs
zeit=uptime1()
如何解决?
尝试为您设置正确的时区:
import os
os.environ['TZ']="America/New_York"
time.tzset()
如此处所述Launching python within python and timezone issue。
Subprosess 正在从 Python 上下文启动一个进程,这可能与您的系统不同。
我认为您解析 uptime
结果的逻辑需要改进。如果你想坚持自己的方式,你应该打印出你从输出中提取的每个子字符串,看看你是否拥有你认为的。我认为您会发现您需要对代码进行相当多的调整。为了帮助您开始,这里是拆分输出的结果:
['15:14:33', 'up', '20', 'min,', '3', 'users,', 'load', 'average:', '0,00,', '0,08,', '0,09']
您正在使用此拆分中的 [2]
和 [4]
,即分钟数和用户数,但您似乎期望第一个给您几天,第二个给您分钟。
作为另一种方式的建议,这里的代码将简单地从字符串中提取所有数字,这将为您提供评估输出中所有数据的起点:
import re
output = '15:14:33 up 20 min, 3 users, load average: 0,00, 0,08, 0,09'
exp = re.compile(r"(\d+)")
i = 0
r = []
while True:
m = exp.search(output, i)
if not m:
break
r.append(int(m.group(1)))
i = m.end(1)
print(r)
结果:
[15, 14, 33, 20, 3, 0, 0, 0, 8, 0, 9]
所以从这里开始,您只需执行 r[3]
、r[5]
等操作即可获取所有数字。这只是您解析输出的一种方式。
导入 os os.environ['TZ']="America/New_York" time.tzset()
我收到一个错误:
~ $ python3 /home/pi/melder_status.py
Traceback (most recent call last):
File "/home/pi/melder_status.py", line 11, in <module>
time.tzset()
NameError: name 'time' is not defined
我找到了另一个解决方案:https://www.raspberrypi.org/forums/viewtopic.php?t=164276
#!/usr/bin/python3
import shlex, subprocess
cmd = "uptime -p"
args = shlex.split(cmd)
p = subprocess.Popen(args, stdout=subprocess.PIPE)
output = p.communicate()
感谢您发布的想法。
打印(输出)
这个问题是指:
如果我在树莓派上使用程序,我会得到错误的时间:
~ $ uname -a
Linux raspberry 5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l GNU/Linux
pi@raspberry:~ $ uptime
15:14:33 up 20 min, 3 users, load average: 0,00, 0,08, 0,09
但输出是:
20 0 1 # days, hours, minutes
我正在使用:
import subprocess
def uptime1(): # liefert Zeit in s
raw = subprocess.check_output('uptime').decode("utf8").replace(',', '')
days = int(raw.split()[2])
if 'min' in raw:
hours = 0
minutes = int(raw[4])
else:
hours, minutes = map(int,raw.split()[4].split(':'))
print(days, hours, minutes)
totalsecs = ((days * 24 + hours) * 60 + minutes) * 60
return totalsecs
zeit=uptime1()
如何解决?
尝试为您设置正确的时区:
import os
os.environ['TZ']="America/New_York"
time.tzset()
如此处所述Launching python within python and timezone issue。 Subprosess 正在从 Python 上下文启动一个进程,这可能与您的系统不同。
我认为您解析 uptime
结果的逻辑需要改进。如果你想坚持自己的方式,你应该打印出你从输出中提取的每个子字符串,看看你是否拥有你认为的。我认为您会发现您需要对代码进行相当多的调整。为了帮助您开始,这里是拆分输出的结果:
['15:14:33', 'up', '20', 'min,', '3', 'users,', 'load', 'average:', '0,00,', '0,08,', '0,09']
您正在使用此拆分中的 [2]
和 [4]
,即分钟数和用户数,但您似乎期望第一个给您几天,第二个给您分钟。
作为另一种方式的建议,这里的代码将简单地从字符串中提取所有数字,这将为您提供评估输出中所有数据的起点:
import re
output = '15:14:33 up 20 min, 3 users, load average: 0,00, 0,08, 0,09'
exp = re.compile(r"(\d+)")
i = 0
r = []
while True:
m = exp.search(output, i)
if not m:
break
r.append(int(m.group(1)))
i = m.end(1)
print(r)
结果:
[15, 14, 33, 20, 3, 0, 0, 0, 8, 0, 9]
所以从这里开始,您只需执行 r[3]
、r[5]
等操作即可获取所有数字。这只是您解析输出的一种方式。
导入 os os.environ['TZ']="America/New_York" time.tzset()
我收到一个错误:
~ $ python3 /home/pi/melder_status.py
Traceback (most recent call last):
File "/home/pi/melder_status.py", line 11, in <module>
time.tzset()
NameError: name 'time' is not defined
我找到了另一个解决方案:https://www.raspberrypi.org/forums/viewtopic.php?t=164276
#!/usr/bin/python3
import shlex, subprocess
cmd = "uptime -p"
args = shlex.split(cmd)
p = subprocess.Popen(args, stdout=subprocess.PIPE)
output = p.communicate()
感谢您发布的想法。 打印(输出)