Retours d'expérience
Sur cette page
Ces cinq entrées racontent des erreurs et des frictions que le projet a mesurées en pilotant GIMP, Inkscape et Blender depuis un modèle : le fait observé, le mécanisme, la correction et la façon de la vérifier. Elles s’adressent à qui écrit des scripts pour ces applications, ou des guides qui les décrivent.
Les entrées sont classées par date. Chaque chiffre renvoie à une ligne d’un guide du dépôt ou d’une page de ce site, que l’entrée nomme. Cette page n’existe qu’en français.
12 octobre 2026 : une commande -b de GIMP rend la main, et le pont s’arrête avec elle
- Fait : au premier lancement de GIMP avec son interface, le pont chargé par une commande
-bseule, la fenêtre s’est ouverte mais le port 9301 est resté fermé. La sortie disaitbatch command executed successfullyetss -ltnne listait aucun socket en écoute. - Mécanisme : une commande
-bqui se termine rend la main, et le processus du greffonpython-fu-eval, celui qui exécute le pont, s’arrête avec elle ; GIMP lui-même reste ouvert. Ce greffon n’a pas de boucle bloquante qui le garde en vie. - Correction : le pont fournit
serve_main_thread(), qui fait tourner la boucle principale de GLib dans le fil d’exécution qui l’appelle, jusqu’àstop(), jusqu’à la durée passée en paramètre ou jusqu’à Ctrl+C. Les commandes des guides l’appellent à la fin du-b. Règle de méthode retenue : vérifier un nom d’API sur le processus vivant avant de l’employer (Gimp.FillType.FOREGROUND,layer.fill,Gegl.Color.new('blue')), jamais sur la mémoire du modèle. - Vérification : la section
Started without the interfacededocs/modules/gimp.mddécrit le mécanisme et le port 9301 qui se ferme dès que la commande rend la main. La page Compatibilité relève le port ouvert environ 6 s après le démarrage de GIMP quand la commande appelleserve_main_thread().
20 octobre 2026 : une API change de nom entre deux versions, et trois appels échouent sans message
- Fait : l’exemple du guide de GIMP fonctionne, mais le reste de l’API Python de GIMP 3.0 a été renommé par rapport à GIMP 2.10.
Gimp.Image.newprend un type de base (Gimp.ImageBaseType.RGB) et non unGimp.ImageType; les couleurs sont desGegl.ColoretGimp.RGBAn’existe plus ;Gimp.ChannelOpest devenuGimp.ChannelOps;Gimp.BucketFillTypeest devenuGimp.FillType;Gimp.File.loadest devenuGimp.file_load. Dans Inkscape 1.4,inkex.Circle.new(64, 64)donnecx="64.0" cy="0.0" r="64.0", un cercle collé au bord supérieur du document, etinkex.Pathn’a aucune méthode de segment. Trois appels de GIMP échouent sans lever d’erreur :image.insert_layeravec un calque d’une autre image ne fait rien, etimage.get_layers()reste vide ;layer.edit_bucket_filla laissé un calque entièrement transparent, l’image aplatie valantsrgba(0,0,0,0);layer.scaleavec une hauteur négative (-1) ne fait rien. - Mécanisme : la documentation d’un module est écrite d’après une exécution sur une version, tandis que le script qu’un modèle écrit de mémoire vise une autre version. Le pont ne voit rien : l’application répond par une
AttributeErrorou uneTypeError, et un modèle qui ne connaît pas les nouveaux noms conclut que l’API est cassée. Les échecs sans message sont les plus coûteux, parce que le résultat est faux sans que rien le dise. - Correction : le guide de chaque module porte les renommages de la version sur laquelle il a été éprouvé, ainsi que les pièges qui ne lèvent pas d’erreur. Devant une
AttributeErrorsur une API qu’on croit connaître, liredir()dans l’application vivante plutôt que de conclure. - Suite, le 21 octobre 2026 : le guide donnait
layer.fillpour remplaceredit_bucket_fill. En jouant la recette de la page GIMP, un script est resté sans erreur et a exporté une seule couleur :layer.fillignore la sélection. Sur une ellipse sélectionnée, un calque transparent rempli parlayer.filla montré un alpha de 1,0 dans son coin, et 0,0 aveclayer.edit_fill, qui respecte la sélection. - Vérification : la section
GIMP 3.0 API: renamed calls and silent failuresdedocs/modules/gimp.md; la sectioninkex 1.4: traps that raise no errordedocs/modules/inkscape.md; les scripts et les réponses de la page GIMP.
20 octobre 2026 : Blender en Workbench, quatre réglages qui donnent un rendu faux sans erreur
- Fait : pour un rendu piloté par
bpy, jugé au pixel, dans le moteur de rendu Workbench et lancé parblender -b, quatre réglages donnent un rendu faux sans message.scene.display.shading.color_type = "OBJECT"litobject.color, blanc par défaut : tout est blanc.material.diffuse_colorest en linéaire : écrire la valeur sRGB de#c4553arend#E39C83. Le fond reste le gris du thème,srgba(64,64,64,1), même quand une couleur de monde est assignée :background_type = "WORLD"ne change rien et"CUSTOM"échoue en mode arrière-plan. Un biseau posé aprèsobj.scaleest écrasé par l’échelle. Enfin, un PNG transparent se lit comme une image blanche dans un visionneur qui compose sur du blanc. - Mécanisme : chaque réglage paraît correct là où l’œil regarde (l’étiquette
OBJECT, la couleur assignée, la valeurWORLD, la largeur du biseau), aucun ne lève d’erreur, et l’échec se réduit à un rendu faux. Le modèle écrit d’après sa mémoire de l’API de Blender, qui reste celle d’anciennes versions ; seul l’histogramme du PNG rendu a fourni la donnée qui contredit. - Correction : pour tout rendu
bpytravaillé au pixel, employercolor_type = "MATERIAL"et convertir les couleurs de sRGB en linéaire avant de les assigner ; composer le fond après le rendu transparent (magick render.png -background "#f4efe8" -alpha remove -alpha off), sans l’attendre du moteur de rendu ; appliquer l’échelle au maillage (bpy.ops.object.transform_apply(scale=True)) avant tout biseau ; prouver la couleur réelle par un histogramme (magick render.png +dither -colors 6 -format %c histogram:info:) et juger l’image composée, pas le PNG transparent. - Vérification : la liste de
docs/modules/blender.mdpour le moteur Workbench, mesurée dans Blender 4.3.2. Dans le moteur de rendu par défaut, le même genre de piège existe : la transformation de vueAgXa rendu#103759pour une couleur de monde écrite#1c385c, et la page Blender montre le script, la réponseoket la correction.
20 octobre 2026 : un guide affirmait un rendu possible sans l’avoir essayé
- Fait : le guide du module Blender disait qu’un script pouvait encore faire un rendu volontaire dans le répertoire de travail ; la mesure en
blender -ba conclu l’inverse :bpy.ops.render.renderbloquait jusqu’au délai de 30 s. - Mécanisme : la phrase avait été écrite d’après l’API publique, sans exécution.
- Gravité : un lecteur du guide perdait 30 s et la connexion du pont à chaque rendu.
- Correction : une capacité n’entre dans un guide de module qu’avec la version et le mode où elle a été jouée ; sinon le guide dit « non essayé ».
- Vérification :
git show a714b22 -- docs/modules/blender.mddu dépôt de code retire la phraseA script can still render on purpose; la sectionRenderingdu même guide la remplace. L’entrée suivante corrige la conclusion de cette mesure.
20 octobre 2026 : le blocage du rendu est intermittent, et un premier essai réussi ne prouve rien
- Fait : la première mesure donnait le blocage du rendu comme constant en
blender -bet l’attribuait au fil d’exécution réseau du pont. Rejoué avec l’ancienne amorce, qui se contente de dormir, le même rendu a réussi aux deux premiers essais, est resté sans retour à un essai (le Hub a répondutimeoutau bout de 30 s, puisbusy), et a réussi 20 fois de plus, sous charge comprise : 22 réussites sur 23 essais. Avec l’amorce qui appelleserve_main_thread(): 11 rendus sur 11. - Mécanisme : Blender ne garantit pas
bpy.opshors de son fil principal ; le rendu y réussit presque toujours et peut ne jamais revenir. La condition exacte de l’échec n’a pas été isolée : l’écran, la charge et le moteur ont été écartés comme condition suffisante. Une hypothèse écrite avant la mesure (« cela dépend de l’écran ») a dû être retirée des fiches. - Gravité : un défaut intermittent se déclare « non reproduit » à la première réussite, ou « dépend de l’environnement » à la première explication plausible ; les deux conclusions étaient fausses.
- Correction : pour un défaut signalé une seule fois, mesurer sa fréquence (nombre d’essais, nombre d’échecs) avant d’écrire une condition ; ne corriger que par la cause que la documentation de l’application confirme, ici exécuter dans le fil principal ; relever le nombre d’essais plutôt qu’un « reproduit » ou un « non reproduit ».
- Vérification : la section
Renderingdedocs/modules/blender.mddonne les 11 rendus et les 22 réussites sur 23 ;tests/bridges/test_blender_adapter.pycouvre le passage du script au fil principal parserve_main_thread(). La page Compatibilité relève 30,5 s et 31,2 s pour le premier rendu d’un profil neuf, avec un délai de 120 s.