Wie stelle ich die Hardware Uhr mit Python auf Embedded Linux Systemen ein?Setzen Sie die Hardware-Uhr in Python?
Antwort
Wahrscheinlich keine einfache Möglichkeit, außer einem Aufruf von os.system().
import os
os.system('hwclock --set %s' % date_str)
oder mit dem ‚date‘ Befehl
import os
os.system('date -s %s' % date_str)
oder wenn Sie einige c Codierung zu tun sterben, ruft das System Umwickeln mit swig ... aber ich denke, dass mehr Arbeit sein würde als es ist wert.
Eine aktualisierte Version auf Ubuntu 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"))
Wichtiger Hinweis: Sie manuell eingestellt müssen, um die Zeit-/Datumseinstellungen ändern (set-ntp false
) oder auch auf die aktuelle sie wird es sofort wieder ändern Zeit.
hwclock -w
stellt die Hardware-Uhr auf die aktuelle Systemzeit basiert (durch date
)
Es ist erforderlich, dass date
& hwclock
sowie sudo
ausgeführt werden.
Hier wird ioctl
verwendet, um die Hardwareuhr wie gewünscht einzustellen (aber nicht die Systemuhr). Es vermeidet zusätzliche Prozesse, ist aber komplizierter. Ich benutze pytz
und dateutil
um lokale/utc Konvertierungen zu behandeln. Fühlen Sie sich frei, den Code (3-Klausel BSD-Lizenz) zu verwenden. Holen Sie die Uhr mit get_hwclock()
und legen Sie es mit set_hwclock()
...
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())
vielen Dank. Ist das auch als Bibliothek verfügbar? Mir wurde gesagt, dass Kopieren und Einfügen ein schlechtes Muster ist. – guettli
@guettli: Bibliothek: nicht, dass ich weiß. Soweit es mich betrifft, würde ich Copy & Paste ** innerhalb einer Codebasis ** ein schlechtes Muster betrachten. Aber das Kopieren von Drittanbieter-Code, das Speichern in einer Datei mit korrekter Lizenzierung und das Verwenden von Produktionscode ist ein anderes Biest: Es bleibt so TROCKEN, wie Sie es bekommen werden ... –
- 1. Setzen Sie Operationen in Python
- 2. regex die Gruppenlänge in Python setzen
- 3. Setzen Sie ein Textbanner in die Navigationsleiste
- 4. Setzen Sie die IHostingEnvironment in Komponententest
- 5. Setzen Sie die Cursorposition in Mac OS
- 6. wie Cookie in Python setzen
- 7. Setzen Sie die Größe von wx.GridBagSizer dynamisch
- 8. Python setzen Dezimalgenauigkeit
- 9. Auf Dict setzen Python
- 10. Wie Sie eine Python-Eigenschaft in __init__ setzen
- 11. So erhalten/setzen Sie den logischen Verzeichnispfad in Python
- 12. Wie Sie die Leerzeichen in einem String-Format in Python 3 setzen
- 13. Setzen Sie die Header mit pandas.read_csv
- 14. Wordpress get_next_post setzen Sie die Kategorie
- 15. Wo setzen Sie die dotcloud.yml-Datei?
- 16. setzen Sie die „Bezugszeit“ von ScheduledExecutorService
- 17. Setzen Sie die Statusleiste auf schwarze Farbe
- 18. Silverlight Toolkit, wo setzen Sie die Binärdateien
- 19. Python - CherryPy testen - Sitzungsdaten setzen?
- 20. Setzen Sie die Tastenkombination auf IntelliJs Werkzeugfenster
- 21. Setzen Sie die Navigationsleisten auf transluzent: NO
- 22. Setzen Sie die Eigenschaft hibernate.dialect Fehlermeldung
- 23. Setzen Sie WebSphere-Variablen über die Eingabeaufforderung
- 24. Setzen Sie die Schwerkraft einer Ansicht programmgesteuert
- 25. Setzen Sie die Ausrichtung einer Tooltriptextbox
- 26. Setzen Sie die Metadaten auf mp4
- 27. So setzen Sie die anonyme Funktion zurück
- 28. Setzen Sie JSON in Array
- 29. Setzen Sie den Pin des seriellen Ports hoch mit Python
- 30. Setzen Sie die Anzahl der gefundenen Wörter in eine Variable
Es sollte möglich sein, zu tun - vorausgesetzt, die rtc oder RTCN Treiber vorhanden ist - über ioctl, in Fcntl per http: //docs.python .org/library/fcntl.html und rtc (4) (oder die Dokumentation/rtc.txt des Kernels) - wenn Sie jedoch Python auf dem System haben, sollte hwclock einfach passen. –
Zdav, danke für die Hilfe. Nur ein Hinweis: Ich benutze busybox, und zuerst muss die Systemuhr mit "os.system ('datum -s% s'% date_str)" geändert werden, und dann stellen Sie die Uhr hw von Systemuhr mit os.system ('hwclock -w). Grüße –