Importer du code python dynamiquement

Et recharger ce code dynamiquement

a marqué ce sujet comme résolu.

Bonjour à tous,

J’aurais besoin de votre aide pour une question de design de logiciel.

Je commence par vous donner du contexte :

  • CadQuery est une librairie python basée sur OpenCascade qui permet de créer des modèles géométriques 3D.
  • Je développe actuellement un logiciel GUI avec pyqt pour pouvoir visualiser ces modèles 3D.

Les formats de fichiers 3D habituels sont des formats avec les extensions suivantes : .stl, .step, .obj, .iges … Or pour cadquery les fichiers de modèles 3D sont des fichiers python.

J’en viens donc à ma question qui est : Comment puis-je importer ces modèles cadquery (au format .py donc) dans mon application GUI ?

J’ajoute à cette question quelques contraintes :

  • Je veux que mon application recharge automatiquement le fichier si il a été modifié par un logiciel extérieur.
  • Les objets python de cadquery ne sont pas picklable.

En creusant un peu la question une solution qui pourrait fonctionner serait d’importer le fichier python du modèle 3D pendant l’exécution de mon app GUI et de le recharger via importlib.reload à chaque changement cependant il semble que importlib.reload soit limité, si par exemple on supprime tout le contenu du fichier python du modèle 3D, si j’appelle importlib.reload l’interpréteur de mon app GUI aura toujours les anciens objets en mémoire et cela peut donc mener à des comportements inattendus.

De la même manière si mon fichier python modèle 3D importe lui même d’autres modules, cela peut être compliqué de s’assurer que tout a bien été rechargé correctement.

Je ne connais pas trop les fonctionnement de python à ce niveau la donc je ne sais pas trop comment je pourrais m’y prendre.

A l’écoute de vos propositions, Merci

+0 -0

Merci pour ta réponse,

Je connais déjà ce logiciel et je m’inspire pas mal de ce dernier pour réaliser ce que je souhaite. Mais ce logiciel supporte assez mal les imports au sein même du fichier .py de modèle 3D. Le soucis est qu’il va parfois renvoyer des erreurs du type module not found etc.

En ayant poussé un peu plus la réflexion je pense que l’idéal serait d’exécuter un script python qui prendrais en entrée le fichier modèle et sérializerais les objets cadquery pour pouvoir être ensuite chargés dans ma GUI. En faisant cela j’évite d’importer le code du modèle directement dans la mémoire de ma GUI et donc j’ai plus de contrôle sur ce qui se passe.

Le problème étant que les objets cadquery ne peuvent pas être sérializés mais j’ai d’autres alternatives qui peuvent être fonctionnelles : exporter les objets cadquery au format .brep que je viendrais ensuite lire comme un fichier classique.

Le principal défaut de cette approche est que je perds de l’information sur les objets cadquery car je vais devoir les caster dans un type plus bas niveau pour les exporter au format .brep cependant cela devrait pouvoir fonctionner.

PS : J’ai posé la question sur le github du projet cadquery mais je me permets de poser la question également ici de manière plus générale :

  • Est-il possible de serializer des objects python issus d’un binding de librairie C/C++ (dans ce cas présent avec pybind11) ?
  • Si oui y a t’il une procédure généralement applicable ou est-ce quelque chose à traiter au cas par cas ?

Merci !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte