Le langage Python est très utilisé par nos clients, en particulier sur les Raspberry Pi. L'une des forces de Python est le repository Python Package Index (PyPI) qui permet d’utiliser facilement de très nombreuses librairies, dont la librairie Yoctopuce. Cependant, certaines distributions Linux récentes bloquent l'utilisation de ce repository si on n'utilise pas de venv.
Dans notre tutoriel Python, on explique qu'il suffit d'utiliser la commande "pip install yoctopuce" pour installer notre librairie sur une machine. Pourtant, si l'on exécute cette commande sur un Raspberry Pi fraîchement installé, voilà le résultat :
yocto@rpi:~ $ pip install yoctopuce error: externally-managed-environment × This environment is externally managed ╰─> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to install. If you wish to install a non-Debian-packaged Python package, create a virtual environment using python3 -m venv path/to/venv. Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make sure you have python3-full installed. For more information visit http://rptl.io/venv Note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages. hint: See PEP 668 for the detailed specification.
Ce message apparaît dans certaines distributions Linux récentes comme Debian, Ubuntu et leurs dérivés.
venv kezako?
Un venv (virtual environment) Python est un espace isolé où on peut installer des paquets Python sans affecter le reste du système. Ce système a été introduit avec Python 3.3 et permet d'éviter les conflits entre les différentes versions de packages utilisés par les applications Python. Au lieu d'avoir un environnement global pour toute la machine, on crée un environnement par projet.
Alors, comment faire pour installer la libraire Yoctopuce (ou n'importe quelle autre librairie) en utilisant pip?
Créer un environnement virtuel
L'option recommandée est de créer un venv pour le projet.
Pour illustrer l'utilisation des venv, on va utiliser un exemple basique qui liste les modules Yoctopuce connectés sur le port USB et sauver le code dans le fichier ~/test/inventory.py.
errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("init error" + str(errmsg))
print('Device list')
module = YModule.FirstModule()
while module is not None:
print(module.get_serialNumber() + ' (' + module.get_productName() + ')')
module = module.nextModule()
YAPI.FreeAPI()
Il faut ensuite créer un venv que nous allons stocker dans le répertoire ~/yocto_venv avec la commande suivante:
yocto@rpi:~/test $ python -m venv ~/yocto_venv
Cela crée un dossier ~/yocto_venv contenant une version isolée de Python et pip.
Pour pouvoir utiliser cet environnement virtuel, il faut l'activer avec la commande suivante:
yocto@rpi:~/test $ source ~/yocto_venv/bin/activate (yocto_venv) yocto@rpi:~/test $
Comme vous pouvez le voir, le shell est modifié et utilise désormais la version de Python et les packages de l’environnement virtuel.
Sous Linux c'est facilement vérifiable en utilisant la commande which.
yocto@rpi:~/test $ which python /usr/bin/python yocto@rpi:~/test $ source ~/yocto_venv/bin/activate (yocto_venv) yocto@rpi:~/test $ which python /home/yocto/yocto_venv/bin/python
Une fois l’environnement virtuel activé, il est possible d'installer la libraire Yoctopuce à l'aide de pip:
(yocto_venv) yocto@rpi:~/test $ pip install yoctopuce Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting yoctopuce Using cached https://www.piwheels.org/simple/yoctopuce/yoctopuce-2.0.63620-py2.py3-none-any.whl (5.4 MB) Installing collected packages: yoctopuce Successfully installed yoctopuce-2.0.63620
La librairie est installée dans le répertoire ~/yocto_venv et utilisable uniquement par cet environnement virtuel.
yocto@rpi:~/test $ python inventory.py
Utiliser l’environnement sans l'activer
Notez qu'il est aussi possible d'utiliser directement l'environnement virtuel sans avoir besoin de l'activer. Il suffit d'utiliser l'exécutable Python ou pip stocké dans le répertoire de l'environnement virtuel:
yocto@rpi:~/test $ ~/yocto_venv/bin/python inventory.py
L'utilisation du port USB
Si vous utilisez notre librairie pour vous connecter à un YoctoHub ou à VirtualHub, tout fonctionne sans problème. Mais si vous utilisez les modules connectés sur les ports USB, il y a encore un détail à prendre en considération.
Sous Linux, l'accès aux ports USB en écriture est bloqué pour les utilisateurs "non-root". Et YAPI.RegisterHub() retourne le message d'erreur: "the user has insufficient permissions to access USB devices".
Pour contourner ce problème, il y a deux solutions.
La première est d’installer une règle udev pour autoriser tous les utilisateurs à accéder aux modules Yoctopuce. Cette procédure est expliquée dans la documentation de nos modules et ne pose pas de problème avec les venv.
L'autre solution est de simplement lancer le programme Python en tant que root à l'aide de la commande sudo. Mais cette solution comporte un piège quand on l'utilise avec les venv. L'activation du venv ne fonctionne pas, il faut impérativement utiliser l’exécutable Python ou pip stocké dans le répertoire de l'environnement virtuel.
Par exemple, le code suivant ne fonctionne pas, car la commande sudo utilise le Python système et non pas celui du venv.
yocto@rpi:~/test $ source ~/yocto_venv/bin/activate yocto@rpi:~/test $ sudo python inventory.py Traceback (most recent call last): File "/home/yocto/test/inventory.py", line 1, in <module> from yoctopuce.yocto_api import * ModuleNotFoundError: No module named 'yoctopuce'
Mais si on passe le path complet de l’exécutable Python, cela fonctionne:
yocto@rpi:~/test $sudo ~/yocto_venv/bin/python inventory.py Device list MXPWRRLY-45C5B (Yocto-MaxiPowerRelay) METEOMK2-20713E (Yocto-Meteo-V2)
L'option --break-system-packages
L'autre option disponible est de ne pas utiliser du tout d’environnement virtuel et de forcer l'installation du package globalement. Dans ce cas il faut utiliser l'option --break-system-packages lors de l'installation du package Yoctopuce.
yocto@rpi:~ $ pip install --break-system-packages yoctopuce Defaulting to user installation because normal site-packages is not writeable Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Collecting yoctopuce Using cached https://www.piwheels.org/simple/yoctopuce/yoctopuce-2.0.63620-py2.py3-none-any.whl (5.4 MB) Installing collected packages: yoctopuce Successfully installed yoctopuce-2.0.63620
Le package est installé globalement et la libraire est utilisable par tous les programmes Python et tous les utilisateurs.
Conclusion
Cet article devrait clarifier l'utilisation de la librairie Yoctopuce avec les environnements virtuels Python. Il n'y a en soi rien de compliqué, mais cela peut être un petit peu déroutant quand on débute la programmation avec Python.
L'utilisation ou non d’environnement virtuel Python dépend surtout de votre projet. Si vous avez plusieurs applications Python sur votre machine, cela peu éviter des problèmes de conflits entre des librairies. Mais si vous avez juste un petit programme que vous avez écrit sur un Raspberry Pi, l'option --break-system-packages ne devrait pas poser de problème et vous simplifier passablement la vie.