1 votes

Comment obtenir un UUID avec Python ?

Le rapport du système affichera l'UUID matériel du système au format 01234567-89ab-cdef-0123-456789abcdef.

En utilisant le shell, nous pouvons récupérer le même UUID :

ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)'

Est-il possible d'obtenir cet UUID en Python sans avoir recours à l'exécution d'une commande shell ?

2voto

Ged Byrne Points 481

Réponse courte : pas vraiment.

Longue réponse : en quelque sorte, mais c'est probablement plus de problèmes que cela n'en vaut la peine, à moins que vous ne puissiez vraiment pas utiliser la commande shell pour une raison quelconque. OS X n'expose pas vraiment la configuration du système à Python. La plupart des interfaces scriptables pour configurer OS X sont basées sur le shell ou sur AppleScript (et bien sûr sur les diverses API Objective-C).

Obtenir l'UUID est possible en AppleScript :

tell application "System Information"
    set profile to system profile
    quit
end tell

set delim to AppleScript's text item delimiters
set AppleScript's text item delimiters to "Hardware UUID: "
set uuid to paragraph 1 of text item 2 of profile
set AppleScript's text item delimiters to delim
uuid

Mais comme vous pouvez le constater, c'est un peu alambiqué (et beaucoup plus lent que la méthode du ioreg car elle doit traiter l'ensemble du profil du système).

Il existe un moyen de relier AppleScript à Python, connu sous le nom de Appscript mais c'est n'est plus développé et n'est pas recommandé pour les nouveaux projets. Cependant, si vous êtes vraiment déterminé, vous pouvez convertir l'AppleScript ci-dessus en Python en utilisant Appscript. Mais pour être honnête, cela semble être beaucoup de difficultés pour obtenir un résultat moins bon.

1voto

frogor Points 11

Je suis capable de le faire, mais j'utilise pyobjc comme vu ici :

https://gist.github.com/pudquick/c7dd1262bd81a32663f0

import objc
from Foundation import NSBundle

IOKit_bundle = NSBundle.bundleWithIdentifier_('com.apple.framework.IOKit')

functions = [("IOServiceGetMatchingService", b"II@"),
             ("IOServiceMatching", b"@*"),
             ("IORegistryEntryCreateCFProperty", b"@I@@I"),
            ]

objc.loadBundleFunctions(IOKit_bundle, globals(), functions)

def io_key(keyname):
    return IORegistryEntryCreateCFProperty(IOServiceGetMatchingService(0, IOServiceMatching("IOPlatformExpertDevice".encode("utf-8"))), keyname, None, 0)

def get_hardware_uuid():
    return io_key("IOPlatformUUID".encode("utf-8"))

Si votre cible d'utilisation est le système MacOS Python, heureusement Apple a déjà inclus pyobjc avec chaque version récente de MacOS.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X