La méthode SelectArchitecture de la librairie Python

La méthode SelectArchitecture de la librairie Python

Notre librairie Python fonctionne sur les trois principaux OS (Windows, macOS et Linux). Le 99.9% du temps tout fonctionne comme prévu et la librairie détecte automatiquement l'OS et l'architecture de la machine. Mais sous Linux, dans de rare cas, il est nécessaire de spécifier ce dernier paramètre manuellement. C'est le travail de la méthode YAPI.SelectArchitecture().






Note: Si vous utilisez notre librairie Python sous Windows ou macOS, vous pouvez ignorer cet article, car la détection de l'architecture est fiable et ne pose pas de problème. Cette problématique ne concerne que Linux.


Notre librairie Python est composée de deux parties :

  • Le code Python qui contient les objets de notre librairie
  • Plusieurs librairies dynamiques qui s'occupent de la communication USB et TCP


La partie écrite en Python est 100% portable et fonctionne sur n'importe quel interpréteur Python depuis Python 2.7 ou 3.x.

Cependant, il n'est pas possible d’accéder directement aux ports USB depuis le langage Python. C'est pour cette raison que notre librairie a besoin de librairies dynamiques propres à chaque architecture. Lors de l'exécution, le code Python détecte l'OS et l’architecture (32 ou 64 bits, Intel ou ARM, etc) de la machine et charge la libraire dynamique correspondante.

Les architectures Linux supportées sont:

  • Intel 32 bits (i386)
  • Intel 64 bits (x86_64)
  • ARM 32 bits soft float (armel)
  • ARM 32 bits hard float (armhf)
  • ARM 64 bits (aarch64)


Comme nous l'avons dit, dans l’extrême majorité des cas, la librairie Yoctopuce est capable de détecter l'architecture de la machine et donc la bonne librairie dynamique et tout fonctionne comme sur des roulettes.

Cependant, certains cas ne sont pas automatisables. Par exemple, les processeurs ARM peuvent fonctionner en "soft float" ou en "hard float", et cela dépend de comment a été compilé le kernel Linux de la distribution. Malheureusement il n'y a pas de moyen universel pour déterminer dans quel mode fonctionne votre CPU. Par défaut, la librairie va utiliser la version "hard float" car 90% des distributions ARM fonctionne dans ce mode.

Nous avons aussi croisé une installation Linux étrange sur laquelle l’interpréteur Python détectait le mauvais type de processeur. Mais dans ce dernier cas, le kernel et l’interpréteur Python avaient été malcross compilés.

Dans ces situations, la solution est d'utiliser la méthode YAPI.SelectArchitecture(). Cette fonction prend en argument une chaîne de caractères indiquant l'architecture de la machine (c'est-à-dire: "armhf","armel", "aarch64","i386","x86_64").

Attention! Cette fonction doit être le premier appel à la librairie.

Dans l'exemple suivant, on force la librairie à travailler la version ARM soft float 32 bits. Ce code pourrait, par exemple, être utilisé sur une distribution ARCHLinux.

...
# Forces the Yoctopuce lib to use the armel architecture
YAPI.SelectArchitecture("armel")

errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
    sys.exit("init error: " + errmsg.value)

print('Device list')
module = YModule.FirstModule()
while module is not None:
    print(module.get_serialNumber())
    module = module.nextModule()
....



Notez que le code de cet exemple ne fonctionne que sous Linux avec une architecture ARM soft float 32 bits. Si l'on exécute le code tel quel sous Windows, l'appel à YAPI.RegisterHub retournera une erreur car la librairie essaiera d'utiliser la version Linux ARM chargée.

Une solution plus propre est d'appeler la méthode YAPI.SelectArchitecture() uniquement quand c'est nécessaire, par exemple en testant la présence d'un argument sur la ligne de commande.

...
if sys.argv[1] == 'use_armel_option':
        # Forces the Yoctopuce lib to use the armel architecture
        YAPI.SelectArchitecture("armel")

errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
    sys.exit("init error: " + errmsg.value)

print('Device list')
module = YModule.FirstModule()
while module is not None:
    print(module.get_serialNumber())
    module = module.nextModule()
....




Cette méthode est très rarement utilisée, mais elle permet de contourner la détection de l'architecture et faire fonctionner notre librairie sur des installations Linux exotiques.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.