Comment régler l'horloge matérielle avec Python sur les systèmes Linux embarqués?Définir l'horloge matérielle en Python?
Répondre
Probablement pas un moyen facile autre que de faire un appel os.system().
import os
os.system('hwclock --set %s' % date_str)
ou en utilisant la commande « date »
import os
os.system('date -s %s' % date_str)
ou si vous êtes en train de mourir pour faire un peu de codage c, enveloppant le système appelle avec rasade ... mais je pense que ce serait plus de travail que il vaut la peine.
Une version mise à jour sur 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"))
Note importante: vous devrez peut-être modifier les paramètres heure/date pour définir manuellement (set-ntp false
) ou bien il va changer immédiatement revenir au courant temps.
hwclock -w
définit l'horloge matérielle en fonction du temps du système actuel (fixé par date
)
Il est nécessaire que date
& hwclock
sont exploités comme sudo
aussi bien.
Ceci utilise ioctl
pour régler l'horloge matérielle comme demandé (mais pas l'horloge système). Cela évite les processus supplémentaires mais est plus impliqué. J'utilise pytz
et dateutil
pour gérer les conversions locales/utc. N'hésitez pas à utiliser le code (licence BSD à 3 clauses). Obtenez l'horloge avec get_hwclock()
et réglez avec 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())
merci beaucoup. Est-ce que c'est aussi disponible en bibliothèque? On m'a dit que copier et coller est un mauvais motif. – guettli
@guettli: bibliothèque: pas que je sache. En ce qui me concerne, je considérerais copier et coller ** dans un code de base ** un mauvais modèle. Mais copier du code tiers, l'enregistrer dans un fichier avec une licence appropriée, et l'utiliser dans le code de production est une bête différente: il reste aussi SEC que vous l'aurez ... –
- 1. Définir des produits en Python
- 2. Définir dynamiquement l'héritage en Python
- 3. horloge matérielle à quartz
- 4. horloge matérielle paramètres
- 5. Virtualisation matérielle - Requête d'hyperviseur
- 6. Optimisation matérielle flash Haxe
- 7. Comment définir une classe en Python
- 8. comment définir un tableau en python?
- 9. Définir la sélection en nombres (Python/Appscript)
- 10. Détection de la superposition matérielle
- 11. comment définir MATLABPATH en Python et en utilisant mlabwrap?
- 12. Déployer depuis Git en utilisant Capistrano sans réinitialisation matérielle?
- 13. Comment un code pourrait-il tester et définir le comportement sans une instruction matérielle spéciale?
- 14. Python définir automatiquement les variables
- 15. Windows Mobile - Format bas (réinitialisation matérielle) C#
- 16. Reconnaissance matérielle dans l'espace utilisateur Linux
- 17. recommandation matérielle sharepoint pour les sites publics
- 18. Programmation série (établissement de liaison matérielle)
- 19. Python. Définir attribut « méthode initiale »
- 20. Python définir des fonctions dynamiques
- 21. Meilleure mise à niveau matérielle Visual Studio
- 22. Android Webview + WebViewClient + javascript + entrée matérielle
- 23. Configurer la configuration matérielle du serveur
- 24. Meilleure configuration matérielle pour l'application d'hébergement ASP.NET
- 25. Meilleure façon de définir des dictionnaires multidimensionnels en python?
- 26. comment définir des variables génériques en Python (question de syntaxe)
- 27. Comment définir le délai d'expiration de smtplib en python 2.4?
- 28. Comment définir la taille initiale d'un dictionnaire en Python?
- 29. Python, mécaniser, syntaxe correcte pour définir plusieurs en-têtes?
- 30. Comment obtenir/définir le chemin du répertoire logique en python
Il devrait être possible de le faire - à condition que le conducteur ou pac RTCN est présent - par ioctl, dans fcntl par http: //docs.python .org/library/fcntl.html et rtc (4) (ou Documentation du noyau/rtc.txt) - cependant, si vous avez Python sur le système, hwclock devrait être un ajustement facile. –
Zdav, merci pour l'aide. Juste une note: J'utilise busybox, et d'abord un besoin de changer l'horloge du système avec "os.system ('date -s% s'% date_str)", puis définir l'horloge hw de l'horloge du système avec os.system ('hwclock -w). Cordialement –