¿Cómo obtener UUID con Python?

1

El informe del sistema mostrará el UUID de hardware del sistema en el formato 01234567-89ab-cdef-0123-456789abcdef.

Usando el shell podemos recuperar el mismo UUID:

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

¿Es posible obtener este UUID en Python sin recurrir a la ejecución de un comando de shell?

    
pregunta Johan 22.11.2012 - 20:18

2 respuestas

2

Respuesta corta: no realmente.

Respuesta larga: más o menos, pero probablemente sea más problemático de lo que vale, a menos que realmente no puedas usar el comando de shell por alguna razón. OS X realmente no expone mucha configuración del sistema a Python. La mayoría de las interfaces de secuencias de comandos para configurar OS X están basadas en shell o en AppleScript (y, por supuesto, las distintas API de Objective-C).

Es posible obtener el UUID 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

Pero, como puede ver, es un poco complicado (y es mucho más lento que el método ioreg , ya que tiene que procesar todo el perfil del sistema).

Hay una forma de enlazar AppleScript con Python, conocida como Appscript , pero es ya no está desarrollado , y no se recomienda para nuevos proyectos. Sin embargo, si está realmente determinado, puede convertir el AppleScript anterior en Python usando Appscript. Pero para ser honesto, parece un gran problema obtener un resultado peor.

    
respondido por el robmathers 22.11.2012 - 21:06
1

Puedo hacerlo, pero uso pyobjc como se ve aquí:

enlace

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 tu objetivo de uso es el sistema macOS python, afortunadamente Apple ya incluía pyobjc con cada versión reciente de macOS.

    
respondido por el frogor 08.11.2018 - 15:36

Lea otras preguntas en las etiquetas