Come ottenere UUID con Python?

1

System Report visualizzerà l'UUID hardware del sistema nel formato 01234567-89ab-cdef-0123-456789abcdef.

Usando la shell possiamo recuperare lo stesso UUID:

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

È possibile ottenere questo UUID in Python senza ricorrere all'esecuzione di un comando di shell?

    
posta Johan 22.11.2012 - 20:18
fonte

2 risposte

2

Risposta breve: non proprio.

Risposta lunga: una specie di, ma probabilmente è più un problema che non ne vale la pena, a meno che tu non possa davvero usare il comando della shell per qualche motivo. OS X non espone molto la configurazione del sistema a Python. La maggior parte delle interfacce scriptable per configurare OS X sono basate su shell o su AppleScript (e naturalmente sulle varie API Objective-C).

Ottenere l'UUID è possibile in 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

Ma come puoi vedere, è un po 'complicato (ed è molto più lento del metodo ioreg , dato che deve elaborare l'intero profilo di sistema).

C'è un modo per collegare AppleScript a Python, noto come Appscript , ma è non è più sviluppato e non consigliato per nuovi progetti. Tuttavia, se sei veramente determinato, puoi convertire il precedente AppleScript in Python usando Appscript. Ma ad essere onesti, sembra un grosso problema ottenere un risultato peggiore.

    
risposta data 22.11.2012 - 21:06
fonte
1

Sono in grado di farlo, ma io uso pyobjc come visto qui:

link

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"))

Se il tuo obiettivo di utilizzo è il sistema macOS python, fortunatamente Apple ha già incluso pyobjc con ogni recente versione di macOS.

    
risposta data 08.11.2018 - 15:36
fonte

Leggi altre domande sui tag