2010-02-03 3 views

Antwort

10

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.

+0

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. –

+0

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 –

1

Verwenden Sie die os.system-Funktion von Python, um den Befehl hwclock aufzurufen.

0

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.

1

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()) 
+0

vielen Dank. Ist das auch als Bibliothek verfügbar? Mir wurde gesagt, dass Kopieren und Einfügen ein schlechtes Muster ist. – guettli

+0

@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 ... –

Verwandte Themen