4. Méthode Mamba
Nous utilisons peu pil dans le contexte d’une installation conforme, c’est mamba et conda forge qui sont essentiellement mis en œuvre. Dans ce cas, nous devons également utiliser une approche basée sur un sous-processus. Deux fonctions sont utilisables: pypkgs_pkg_conda_simple et pypkgs_pkg_conda_json. Elles diffèrent selon la manière dont mamba produit la sortie standard (raw ou Json) et le mode de traitement de cette information.
Les deux s’utilisent avec la même syntaxe que les fonctions précédentes à l’exception de l’argument exec qui doit être positionné sur 'mamba' :
pypkgs_pkg_conda_simple(pname, pdict={}, exec='mamba', verb=0)pypkgs_pkg_conda_json(pname, pdict={}, exec='mamba', verb=0) |
Une fois que la chaine stdout_str correspondant à la sortie standard de mamba est obtenue (commande mamba list paquetage ou mamba list paqueage --json), celle ci est transformée en liste de lignes qui sont analysées une à une pour pypkgs_pkg_conda_simple. Dans le cas de pypkgs_pkg_conda_json, la chaine stdout_str est analysée via json.loads(stdout_str) qui nous renvoie un dictionnaire, qui va être analysé pour renseigner les champs ‘name’, ‘ver’, ‘build’ et ‘channel’ de pdict.
Les deux fonctions obtiennent stdout_str via une fonction pypkgs_pkg_conda_cmd qui correspond au lancement du sous-processus. Dans un premier temps, il faut fixer le chemin absolu de l’exécutable, mamba ou conda, par exemple :
|
1 2 3 4 |
if (exec == 'conda'): set_cmd = file_cleanpath("C:/Python3/Scripts/conda.exe") if (exec == 'mamba'): set_cmd = file_cleanpath("C:/Python3/Library/bin/mamba.exe") |
L’approche subprocess fonctionnant avec la méthode pip ne marche plus, il faut le programmer un peu différemment. Mais nous avons un code unique, qui fonctionnera pour mamba et conda, en mode paquetage individuel ou mode liste de paquetages, avec une sortie standard simple ou formatée Json :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# launch command try: p = subprocess.Popen(cmd_strvec, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) stdout, stderr = p.communicate() stdout_str = str(stdout) stderr_str = str(stderr) if (verb > 2): print(stdout_str) except: if (verb > 1): print("!problem with %s or package '%s'" % (exec, pdict['name'])) return stdout_str if (len(stdout_str) <= 0): if (verb > 1): print("!output of '%s' not readable" % (exec)) return stdout_str # process output if stdout_str.startswith("b'") or stdout_str.startswith('b"'): stdout_str = stdout_str[2:-1] stdout_str = stdout_str.replace('\\r', '') stdout_str = stdout_str.encode().decode('unicode_escape') if (verb > 2): print(stdout_str) # done and return outout string return stdout_str |
Il faut se battre un peu avec les bytes et l’encodage, mais au final on obtient une valeur de stdout_str qui est tout à fait utilisable.
Test drive
Nous utilisons la séquence pypkgs_init_pdict > pypkgs_importlib > pypkgs_pkg_pip > pypkgs_pkg_conda_simple (si s’affichera mamba) > pypkgs_pkg_conda_json (qui s’affichera mamba-json).
Dans le cas de PIL le score est amélioré pour mamba (simple) sans qu’il y ait de nouvelles informations, par contre mamba-json ne se fait pas avoir, la méthode refuse le scoring :
importlib: package 'PIL' resolved with score=160mamba: package 'PIL' resolved with score=168 |
Le paquetage pillow voit son score amélioré, car nous avons accès au ‘channel’ (canal de disribution) et au ‘build’. Les deux versions mamba (simple) et mamba-json convergent.
importlib: package 'pillow' resolved with score=64pip: package 'pillow' resolved with score=80mamba: package 'pillow' resolved with score=88mamba-json: package 'pillow' resolved with score=88{'name': 'pillow', 'ver': '11.3.0', 'loc': 'C:\\Python3\\envs\\prod\\Lib\\site-packages', 'files': [], 'err': '', 'installer': '', 'channel': 'conda-forge', 'score': 88, 'summary': 'Python Imaging Library (Fork)', 'pythonver': '>=3.9', 'req': [''], 'reqby': ['matplotlib', 'reportlab'], 'build': 'py312h5ee8bfe_3'} |
Dans le cas de Pillow, nous avons le même score que 'pillow' mais mamba ne se fait pas avoir sur la valeur de ‘build’ et de ‘channel’ qui restent vides, quand à mamba-json, la méthode refuse le scoring.
Dans le cas de numpy le score est amélioré car nous avons accès au ‘channel’ et au ‘build’, les deux méthodes convergent pour un score de 248.
Les écarts entre mamba (simple) et mamba-json sont probablement dus à l’interprétation de la chaine une fois transformée en lignes, qui doit être laxiste par rapport aux exceptions, ce qui est plus facile à traiter avec une chaîne formatée Json. Dans la pratique j’utilise pypkgs_pkg_conda_json.