임베디드 Linux 시스템에서 파이썬으로 하드웨어 시계를 설정하려면 어떻게합니까?파이썬에서 하드웨어 시계를 설정합니까?
답변
os.system() 호출 이외의 다른 쉬운 방법은 없을 것입니다.
import os
os.system('hwclock --set %s' % date_str)
또는 일부 C 코딩을 할 죽어가는 경우
import os
os.system('date -s %s' % date_str)
가하거나, 시스템을 포장하는 것은 꿀꺽 꿀꺽으로 호출하는 '날짜'명령을 사용하여 ...하지만 그보다 더 많은 작업이 될 것이라고 생각 그 가치.
우분투 16.04에 업데이트 된 버전 :
import subprocess
import shlex
subprocess.call(shlex.split("timedatectl set-ntp false")) # May be necessary
subprocess.call(shlex.split("sudo date -s '2 OCT 2006 18:00:00'"))
subprocess.call(shlex.split("sudo hwclock -w"))
중요 : 수동 설정 시간/날짜 설정을 변경 (set-ntp false
)가 필요하거나 그렇지 않으면 즉시 현재로 다시 변경됩니다 시각.
hwclock -w
&
date
hwclock
뿐만 아니라
sudo
으로 실행되어 (
date
설정) 현재 시스템 시간
그것은 필요에 기초하여 상기 하드웨어 클럭을 설정한다.
이 값은 ioctl
을 사용하여 하드웨어 클럭을 요청한대로 설정합니다 (시스템 클럭은 아님). 추가 프로세스는 피할 수 있지만 더 복잡합니다. 로컬/utc 변환을 처리하기 위해 pytz
및 dateutil
을 사용하고 있습니다. 자유롭게 코드를 사용할 수 있습니다 (3 절 BSD 라이센스). RTC 또는 rtcN 드라이버가 존재 제공 - -
from collections import namedtuple
from datetime import datetime
from fcntl import ioctl
import struct
from dateutil.tz import tzutc
from pytz import timezone
# From `uapi/asm-generic/ioctl.h`
_IOC_NRBITS = 8
_IOC_TYPEBITS = 8
_IOC_SIZEBITS = 14
_IOC_DIRBITS = 2
_IOC_NRMASK = (1 << _IOC_NRBITS) - 1
_IOC_TYPEMASK = (1 << _IOC_TYPEBITS) - 1
_IOC_SIZEMASK = (1 << _IOC_SIZEBITS) - 1
_IOC_DIRMASK = (1 << _IOC_DIRBITS) - 1
_IOC_NRSHIFT = 0
_IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS
_IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS
_IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS
_IOC_NONE = 0
_IOC_WRITE = 1
_IOC_READ = 2
def _IOC(dir, type, nr, size):
return ((dir << _IOC_DIRSHIFT) |
(type << _IOC_TYPESHIFT) |
(nr << _IOC_NRSHIFT) |
(size << _IOC_SIZESHIFT))
def _IOC_TYPECHECK(t):
return len(t)
def _IO(type, nr):
return _IOC(_IOC_NONE, type, nr, 0)
def _IOR(type, nr, size):
return _IOC(_IOC_READ, type, nr, _IOC_TYPECHECK(size))
def _IOW(type, nr, size):
return _IOC(_IOC_WRITE, type, nr, _IOC_TYPECHECK(size))
def to_utc(dtobj):
if dtobj.tzinfo is None:
dtobj = timezone("UTC").localize(
dtobj.replace(tzinfo=None) - tzlocal().utcoffset(dtobj))
return dtobj.astimezone(timezone("UTC"))
class RtcTime(namedtuple(
# man(4) rtc
"RtcTime",
"tm_sec tm_min tm_hour "
"tm_mday tm_mon tm_year "
"tm_wday tm_yday tm_isdst" # Last row is unused.
)):
_fmt = 9 * "i"
def __new__(cls, tm_sec=0, tm_min=0, tm_hour=0,
tm_mday=0, tm_mon=0, tm_year=0,
tm_wday=0, tm_yday=0, tm_isdst=0):
return super(RtcTime, cls).__new__(cls, tm_sec, tm_min, tm_hour,
tm_mday, tm_mon, tm_year,
tm_wday, tm_yday, tm_isdst)
def __str__(self):
return self.to_datetime().isoformat()
@classmethod
def from_datetime(cls, dtobj):
dt = to_utc(dtobj)
return cls(tm_sec=dt.second, tm_min=dt.minute, tm_hour=dt.hour,
tm_mday=dt.day, tm_mon=dt.month - 1, tm_year=dt.year - 1900)
def to_datetime(self):
# From `hwclock.c`.
return datetime(
year=self.tm_year + 1900, month=self.tm_mon + 1, day=self.tm_mday,
hour=self.tm_hour, minute=self.tm_min, second=self.tm_sec,
tzinfo=tzutc())
def pack(self):
return struct.pack(self._fmt, *self)
@classmethod
def unpack(cls, buffer):
return cls._make(struct.unpack(cls._fmt, buffer))
# From `uapi/linux/rtc.h`
rtc_time = RtcTime().pack()
RTC_RD_TIME = _IOR(ord("p"), 0x09, rtc_time) # 0x80247009
RTC_SET_TIME = _IOW(ord("p"), 0x0a, rtc_time) # 0x4024700a
del rtc_time
def get_hwclock(devrtc="/dev/rtc"):
with open(devrtc) as rtc:
ret = ioctl(rtc, RTC_RD_TIME, RtcTime().pack())
return RtcTime.unpack(ret).to_datetime()
def set_hwclock(dt, devrtc="/dev/rtc"):
with open(devrtc) as rtc:
ioctl(rtc, RTC_SET_TIME, RtcTime.from_datetime(dt).pack())
대단히 감사합니다. 라이브러리로도 사용할 수 있습니까? 나는 copy & paste가 나쁜 패턴이라고 들었다. – guettli
@guettli : 도서관 : 내가 아는 것은 아닙니다. 내가 아는 한, 코드베이스 내에서 복사 & 붙여 넣기 **를 나쁜 패턴이라고 생각합니다. 그러나 타사 코드를 복사하고 적절한 라이센스를 사용하여 파일에 저장하고 프로덕션 코드에서 사용하는 것은 다른 짐승입니다. –
- 1. 어떻게 Linux에서 프로그래밍 방식으로 하드웨어 시계를 설정합니까?
- 2. 특별한 하드웨어 명령없이 어떻게 테스트하고 동작을 설정합니까?
- 3. 어떻게 이벤트 처리기를 Android의 하드웨어 버튼으로 설정합니까?
- 4. 파이썬에서 최상위 변수를 어떻게 설정합니까?
- 5. 석영 하드웨어 시계
- 6. 인터넷을 통해 시계를 동기화하십시오.
- 7. Android에서 시계를 멈추게하려면 어떻게해야하나요?
- 8. 알람 시계를 설정할 수 있습니까?
- 9. org 모드에서 노력과 시계를 내보내시겠습니까?
- 10. 하드웨어 크기
- 11. 하드웨어 시뮬레이션
- 12. 하드웨어 키보드
- 13. C#/Mono로 Linux/Mac 컴퓨터 시계를 설정하는 방법은 무엇입니까?
- 14. Windows 시스템 시계를 변경하지 않고 가짜 시간
- 15. 데이터 및 시간이있는 디지털 시계를 소유하십시오. 효율적으로
- 16. 리눅스는 응용 프로그램에 단조롭게 증가하는 시계를 제공합니까?
- 17. Java ME에서 양식에 디지털 시계를 표시하는 방법
- 18. 세계 시계를 기반으로하는 자바 스크립트 타이머?
- 19. 여러 Fedora 시스템의 시계를 동기화하는 방법
- 20. Android : 위젯으로 맞춤 이미지가있는 시계를 숫자로 업데이트
- 21. 사용자가 시계를 뒤로 설정했는지 확인하려면 어떻게해야합니까?
- 22. 어떻게 _path_를 변수로 설정합니까?
- 23. 글로벌 하드웨어 OnKeyPress
- 24. 하드웨어 장치가없는 자바 사운드
- 25. 하드웨어 지원 OS 기능
- 26. iOS 하드웨어 기반 암호화
- 27. iPhone 하드웨어 확인
- 28. 하드웨어 코덱을 지원하는 FFMPEG
- 29. 하드웨어 ID 란 무엇입니까?
- 30. 시스템 하드웨어 관련
할 수 있어야는 ...
get_hwclock()
와 시계를 얻고set_hwclock()
으로 설정 HTTP 당은 fcntl에, IOCTL을 통해 : //docs.python를 .org/library/fcntl.html과 rtc (4) (또는 커널의 Documentation/rtc.txt) - 그러나 시스템에 파이썬이 있으면 hwclock이 적합해야합니다. –Zdav, 도움에 감사드립니다. 그냥 메모 : 나는 busybox를 사용하고, 먼저 "os.system ('date -s % s'% date_str)"을 사용하여 시스템 시계를 변경 한 다음 os.system을 사용하여 hw clock을 시스템 시계에서 설정해야합니다 ('hwclock -w). 감사합니다 –