Aller au contenu
← Tous les articles
Tutoriel

Installer des paquets Python pour les add-ons Blender (Windows, Blender 4.2+)

Écouter en version balado

Pourquoi pip ne sert à rien dans Blender · 2:11 · voix synthétiques, script rédigé avec l’IA

Transcription

Sylvie : Tu écris un add-on Blender, tu fais pip install, tout se passe bien. Et dans Blender : module introuvable. Ça t'est déjà arrivé ?

Thierry : Non, mais je pense que j'aurais cru que pip était cassé. Qu'est-ce qui se passe vraiment ?

Sylvie : Blender embarque son propre Python. Le pip de ton système installe donc pour un autre interpréteur. Dès qu'un add-on a besoin de NumPy, de meshio ou de requests, il se cogne au même mur.

Thierry : Le paquet est bien installé, mais pas dans la bonne maison.

Sylvie : Voilà. Antoine a écrit un petit installateur, pour Blender 4.2 et plus sous Windows. Il lance pip avec l'interpréteur de Blender lui-même, et le paquet atterrit là où Blender va chercher.

Thierry : Et il met les fichiers où ? Je n'aime pas les add-ons qui demandent les droits administrateur.

Sylvie : Aucun droit admin. Il écrit dans le dossier scripts modules de l'utilisateur, accessible en écriture, et conservé quand l'add-on est rechargé. Il saute aussi les paquets déjà importables, donc une deuxième exécution est rapide.

Thierry : Et l'interface qui fige pendant les téléchargements ?

Sylvie : C'est l'autre moitié du truc. L'installation tourne dans un thread d'arrière-plan, donc Blender reste réactif. Mais seule la boucle principale peut toucher l'interface : les fenêtres passent par les timers de Blender et s'affichent à la fin.

Thierry : Astucieux. On l'utilise comment ?

Sylvie : Deux options. Tu colles le script dans l'espace Scripting et tu cliques sur Run Script, ou tu l'appelles dans le register de ton add-on pour livrer les dépendances avec lui.

Thierry : Des pièges ?

Sylvie : Quelques-uns. Redémarrer Blender après la première installation, épingler les versions parce que le Python de Blender n'est pas le 3.12 de ton système, et sur les postes d'entreprise verrouillés, pip peut être bloqué : il faut alors fournir les wheels à la main.

Thierry : Donc les utilisateurs arrêtent de demander quel Python utiliser.

Sylvie : C'est ça, l'idée. Tu maîtrises la liste des dépendances, eux n'ont qu'à cliquer. L'article complet a le script et le tableau de dépannage.

Espace de travail Scripting de Blender : éditeur de texte et Run Script
Table des matières

Les add-ons Blender qui ont besoin de NumPy, meshio ou requests butent tous sur le même mur : Blender embarque son propre Python, donc le pip du système ne sert à rien. J’ai écrit un petit installateur qui cible le sys.executable de Blender, dépose les paquets dans scripts/modules et tourne dans un thread d’arrière-plan pour que l’interface reste réactive (Blender 4.2+, Windows).

1. Le problème en une phrase

Un pip install global ne rend pas import meshio disponible dans Blender : l’interpréteur est celui fourni avec Blender.

2. La stratégie

ÉlémentRôle
sys.executableLancer pip avec le Python de Blender
bpy.utils.user_resource("SCRIPTS", path="modules")Dossier d’installation accessible en écriture, par utilisateur et par version
site.addsitedirRendre les imports résolubles
Thread d’arrière-plan + bpy.app.timersNe pas figer l’interface ; afficher une fenêtre à la fin

3. Le script d’installation

import bpy
import sys
import site
import logging
import subprocess
import threading

# Set up logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)

# List of packages required by the add-on/plugin
REQUIRED_PACKAGES = {
    "fileseq": "fileseq==1.15.2",
    "meshio": "meshio==5.3.4",
    "rich": "rich==13.7.0",
    "requests": "requests==2.31.0"
}

def get_blender_python_path():
    """Returns the path of Blender's embedded Python interpreter."""
    return sys.executable

def get_modules_path():
    """Return a writable directory for installing Python packages."""
    return bpy.utils.user_resource("SCRIPTS", path="modules", create=True)

def append_modules_to_sys_path(modules_path):
    """Ensure Blender can find installed packages."""
    if modules_path not in sys.path:
        sys.path.append(modules_path)
    site.addsitedir(modules_path)

def display_message(message, title="Notification", icon='INFO'):
    """Show a popup message in Blender."""
    def draw(self, context):
        self.layout.label(text=message)
    def show_popup():
        bpy.context.window_manager.popup_menu(draw, title=title, icon=icon)
        return None  # Stops timer
    bpy.app.timers.register(show_popup)

def install_package(package, modules_path):
    """Install a single package using Blender's Python."""
    try:
        logger.info(f"Installing {package}...")
        subprocess.check_call([
            get_blender_python_path(),
            "-m",
            "pip",
            "install",
            "--upgrade",
            "--target",
            modules_path,
            package
        ])
        logger.info(f"{package} installed successfully.")
    except subprocess.CalledProcessError as e:
        logger.error(f"Failed to install {package}. Error: {e}")
        display_message(f"Failed to install {package}. Check console for details.", icon='ERROR')

def background_install_packages(packages, modules_path):
    """Install missing packages in a background thread."""
    def install_packages():
        wm = bpy.context.window_manager
        wm.progress_begin(0, len(packages))
        for i, (module_name, pip_spec) in enumerate(packages.items()):
            try:
                __import__(module_name)
                logger.info(f"'{module_name}' is already installed.")
            except ImportError:
                install_package(pip_spec, modules_path)
            wm.progress_update(i + 1)
        wm.progress_end()
        display_message("All required packages installed successfully.")
    threading.Thread(target=install_packages, daemon=True).start()

# Setup
modules_path = get_modules_path()
append_modules_to_sys_path(modules_path)

# Start package installation
background_install_packages(REQUIRED_PACKAGES, modules_path)

Quatre détails font tout le travail :

  • Dans Blender, sys.executable est l’interpréteur de Blender : pip installe donc pour le Python qui fera l’import.
  • --target écrit dans le dossier utilisateur scripts/modules, accessible sans droits administrateur et conservé quand l’add-on est rechargé.
  • La vérification __import__ saute les paquets déjà importables ; une deuxième exécution est rapide.
  • Les fenêtres passent par bpy.app.timers, car seule la boucle principale peut toucher l’interface, pas le thread d’installation.

4. Comment l’exécuter

Option A — espace Scripting : coller le script dans l’éditeur de texte → Run Script → attendre la fenêtre de confirmation.

Espace Scripting de Blender avec l’installateur dans l’éditeur de texte

Option B — dans le register() d’un add-on :

def register():
    modules_path = get_modules_path()
    append_modules_to_sys_path(modules_path)
    background_install_packages(REQUIRED_PACKAGES, modules_path)

Livrez les dépendances avec l’add-on : les utilisateurs n’ont plus à deviner quel Python utiliser.

5. Dépannage

  • Redémarrer Blender après la première installation.
  • print(sys.path) si un import échoue, pour vérifier que modules figure dans la liste.
  • Épingler les versions : le Python de Blender n’est pas le 3.12 de votre système.

6. Quand ne pas utiliser ce modèle

CasPourquoi
L’add-on vise beaucoup de versions de BlenderÉpingler et tester par version mineure
Piles CUDA lourdesPeuvent dépasser la configuration GPU et pilotes de l’utilisateur
Postes d’entreprise verrouilléspip peut être bloqué ; fournir les wheels à la main

7. À retenir

Automatisez l’installation des dépendances dans le bac à sable de Blender. Les utilisateurs arrêtent de demander « quel Python ? », et c’est vous qui maîtrisez la liste dans REQUIRED_PACKAGES.

8. Articles liés

9. Références


Publié à l’origine sur Medium[4] (en anglais).

Références

  1. API Blender. (). [Web page] docs.blender.org.
  2. Gérer Python dans Blender. (). [Web page] wiki.blender.org.
  3. Guide d’empaquetage Python. (). [Web page] packaging.python.org.
  4. Medium. (). [Article] medium.com.

Les références utilisent la date de publication de cet article.