Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Référence d'objet Python vs. Session Python

Hello,

 

Je suis en train d'explorer les liens avec Python depuis LabVIEW 2023, le tout en 64 bit.

Et je remarque une chose qui me paraît étrange : la référence de session Python à la même valeur (numérique, dans les Probes) que la référence d'objet que me renvoie mon script (Cf. ci-dessous les valeurs de probes en entrée et sorite du nœud Python).

PythonObjectReference.png

 

Au stade de quelques appel, à plat dans un VI, c'est OK. En revanche, à essayer de wrapper le tout dans une classe, je suis confronté à la fermeture brutale et immédiate de LabVIEW.

 

Est-ce que l'un d'entre vous a un peu plus de recul sur l'usage de ces référence d'objets Python ? Des limites identifiées ?

 

Merci d'avance pour vos retours.

0 Compliments
Message 1 sur 3
346 Visites

Side effect du LUGE de la semaine passée (auto-promo), je vais pouvoir saluer d'un grand coup de chapeau l'intuition de Maxime - merci !!

 

Mon problème est (doit être) lié à la durée de vie de l'objet instancié dans le script Python. Pour faire court, la fonction de wrapping permettant d'instancier l'objet que je cherche à réutiliser ensuite, ressemble à ceci :

 

def instanciateMyClass(param1, param2):
    return MyClass(param1, param2)

 

Je peux donc récupérer une référence d'objet Python côté LabVIEW, renvoyé par la fonction instanciateMyClass. Cependant, la durée de vie de l'objet, côté Python est (très vraisemblablement) limitée à la fonction en question. Et donc disparaît de l'espace mémoire Python dès que l'on sort du nœud Python qui invoque cette fonction d'initialisation. Effet de bord, je récupère deux fois la référence de la session, et une référence de session passée comme référence d'objet Python, ben le nœud Python ne l'encaisse pas super bien.

 

J'ai pu contourner en forçant en global l'instance de l'objet créé (pas ouf, mais ça fonctionne). Voire même, si je veux garder la possibilité d'instancier plusieurs objets, en bricolant un dictionnaire id unique / instance d'objet (dans mon cas, il se trouve que ma classe a besoin d'un tag qui doit être unique). Dictionnaire qui ne sert in fine qu'à garder 'vivantes' dans l'espace mémoire de Python, les instances d'objet Python à faire passer d'un nœud Python à l'autre côté LabVIEW.

 

Avec ce contournement, j'ai bien des références distinctes (valeurs numériques observables à la probe différentes). Et très accessoirement, LabVIEW semble apprécier puisqu'il ne me gratifie plus de ses plantages systématiques.

 

Bref, pour référence, si d'autres étaient confrontés au même genre de problème... Bonne semaine !

Message 2 sur 3
312 Visites

Salut Mathieu,

 

Au plaisir d'avoir pu aider. Pas évident de penser au cycle de vie des objets entre 2 langages qui communiquent et qui gèrent eux même la durée de vie tout seul.

 

A tester également, instancier la classe dans la fonction et retourner la variable plutôt que de faire l'instanciation dans la fonction return.

 

def instanciateMyClass(param1, param2):

    MyInstance = MyClass(param1, param2)
    return MyInstance

 

A tester même si j'ai un doute, mais je pense que la fonction return à tout de même un comportement particulier.

A+

Maxime R.  

  CLA - Certified LabVIEW Architect / Architecte LabVIEW Certifié
  CTA - Certified TestStand Architect / Architecte TestStand Certifié

0 Compliments
Message 3 sur 3
303 Visites