Forum Programmation.python Ou trouver de l'aide pour une question Python / Matlab/ .NET ?

Posté par (page perso) . Licence CC by-sa
Tags : aucun
4
2
nov.
2016

Bonjour,

J'ai un problème assez spécifique, et je ne sais pas bien ou chercher de l'aide.

Voici mon problème. J'ai une expérience scientifique (spectromètre + détecteur) qui utilise un logiciel commercial sous Windows 7 (LightField de Princeton Instrument). Ce logiciel est bien, et je souhaite le garder. Cependant, j'ai développé des outils sous python pour interfacer d'autres manips (mais beaucoup plus simple), et je voudrais interfacer le tout.

Il est possible d'automatiser LightField avec LabView, Matlab, C#, Visual Basic, mais malheureusement pas python. Je suis physicien, et pas informaticien de formation, et je ne connais pas du tout C# et Visual Basic. Labview, je ne touche pas à ca… :-). Je connais un peu Matlab, que j'ai avantageusement remplacé par python depuis longtemps. En regardant l'exemple fournis pour automatiser LightField avec Matlab (ainsi que la vidéo Youtube… il y a peu de documentation), on vois que derrière il y a .NET pour appeler les dll permettant de piloter LightField. (D'ailleurs, on trouve sur GitHub l'exemple fournis par Princeton pour LightField : https://github.com/jdieringer/LightField-in-MATLAB )

En utilisant le paquet pythonnet, il me semble que j'arrive à charger correctement les dll. (En tout cas, j'ai accès a des fonctions qui ressemble a des choses permettant de piloter un spectromètre et un détecteur).

Par contre, je suis mauvais en Matlab, et je n'arrive pas a traduire en Python ce qui marche en Matlab. Ainsi, je n'arrive pas a instancier un objet LightField qui me permettrait de faire ce que je souhaite, apparemment je ne passe pas les bons arguments au constructeur. Je pense que tout est marqué dans l'exemple Matlab, mais je ne sais pas comment le traduire en python.

Une idée ou je pourrais demander de l'aide pour une question non-linux, mais Python / Matlab / .NET ?

Merci beaucoup…

Darckense

  • # Quelques pistes méthodologiques

    Posté par . Évalué à 3. Dernière modification le 02/11/16 à 18:00.

    Salut,
    Je ne connais pas du tout les trucs que tu manipules, alors je te donne quelques conseils méthodologiques:

    • Utilise un interpréteur python pour faire tes expérimentations
    • Use (et abuse) des systèmes d'introspection du python
    >>> import introspect
    >>> import truc
    >>> dir(truc)
    >>> help(truc) 
    
    

    Bon courage !

    • [^] # Re: Quelques pistes méthodologiques

      Posté par (page perso) . Évalué à 3.

      Bonjour,

      Tu veux dire le module inspect ? Je ne trouve pas de module introspection.

      Merci pour les conseils, je vais essayer de procéder comme ça, en attendant de trouver comment ça marche ou de tomber sur un guru Matlab/.NET (Je connaissais pas .NET, cela n'a pas l'air franchement simple..)

      Cordialement,

      --
      Darckense

      • [^] # Re: Quelques pistes méthodologiques

        Posté par . Évalué à 2.

        Yep, c'est le module introspect. Il te permet de connaître le nom des méthodes appelées, leurs paramètres… et pareil pour les classes.

        Courage ! Tu n'es plus très loin de la solution…

  • # Constructeur en python ?

    Posté par (page perso) . Évalué à 2.

    Bon, en fouillant, voici ou j'en suis :

    Je dois faire une instance de la classe Automation de LighField

    help(Automation) me retourne:

    help(Automation)
    Help on class Automation in module PrincetonInstruments.LightField.Automation:
    
    class Automation(System.Object)
     |  Void .ctor(Boolean, System.Collections.Generic.List`1[System.String])
     |  
     |  Method resolution order:
     |      Automation
     |      System.Object
     |      builtins.object
     |  
     |  Methods defined here:
     |  
     |  __call__(self, /, *args, **kwargs)
     |      Call self as a function.
    (snip)

    Je crois qu'en C#, le constructeur est .ctor, et il faut un booléen, et une liste.

    Quand j'instancie en Python, j'obtiens :

    from PrincetonInstruments.LightField.Automation import Automation
    instance = Automation(True,[])
    Traceback (most recent call last):
    
      File "<ipython-input-51-c6d7bdf17b14>", line 1, in <module>
        instance = Automation(True,[])
    
    TypeError: no constructor matches given arguments

    Pourtant, la ligne pertinente dans le programme Matlab qui lui fonctionne est :

    out.automation = PrincetonInstruments.LightField.Automation.Automation(visible,[]);

    visible est un booléen initialement égal à True

    Franchement, je ne comprends pas ce qui coince.
    Quelqu'un a une idée ?

    Merci !

    --
    Darckense

    • [^] # Re: Constructeur en python ?

      Posté par . Évalué à 3.

      Lit bien la doc de pythonnet, la méthode pour appeler des trucs est sans doute dedans… De plus, le

      System.Collections.Generic.List`1[System.String]

      n'est peut-être pas mappable directement en list python, il faut peut être instancier la version C#.

      Courage !

      • [^] # Re: Constructeur en python ?

        Posté par (page perso) . Évalué à 2.

        Oui, en fait, il semblerait que c'est ça.
        J'essaye de faire les conseils que l'on m'a donné sur Stack Overflow (voir plus bas), on verra bien.

        Merci

  • # Stack Overflow

    Posté par . Évalué à 5.

    Si l’anglais ne te pose pas de problème tu peux tenter sur https://stackoverflow.com/

    C’est un site de questions/réponses, pas un forum. Il faut donc une question précise. N’hésite pas à éclater en deux ou trois questions par exemple.

  • # Écrire au fabriquant?

    Posté par (page perso) . Évalué à 4.

    Si l'éditeur de Lightfield propose déjà des bindings pour tous ces langages, il y a des chances qu'ajouter Python au mix l'intéresse. Je pense que ça peut valoir le coup de le contacter pour voir s'il te filerait pas un coup de main.

    Sinon, je pense que tu n'es pas très loin, persévère ! Et lis bien la doc de pythonnet. Pour ce qui est des questions, je rejoins le commentaire qui recommande StackOverflow. C'est la meilleure plateforme pour avoir des réponses, mais attention, ils sont très stricts sur leurs règles.

    • [^] # Re: Écrire au fabriquant?

      Posté par (page perso) . Évalué à 2.

      En fait, j'avais déjà posé la question aux ingénieurs qui m’ont installés le matériel, mais je crois que Python, c'est de la science fiction… En France Ropper Instrument est le revendeur de Princeton, il s'agit de matériel scientifique (très cher) qui se vend en très peu d'exemplaire, le soft est fait maison aux US… Quand j'aurais quelque-chose qui fonctionne, je pourrais le leur donner, mais avant.. :-)

  • # Créer une liste en .NET depuis Python ?

    Posté par (page perso) . Évalué à 2.

    Bon, suite à ma question sur Stack Overflow, il semblerait que je doive convertir l'argument de liste Python en C#.

    Il y a un exemple : http://stackoverflow.com/questions/40403221/how-to-use-python-and-net-c-to-automatise-princeton-instruments-lightfield

    Mais je ne comprends pas l'exemple en C#, et l'exemple en python (ci-dessous) ne marche pas.

    >>> import clr
    >>> clr.AddReference(r"C:\Debug\ListInConstr")
    <System.Reflection.RuntimeAssembly object at 0x02849E50>
    >>> from ListInConstr import ListInConstr
    >>> ListInConstr.__overloads__
    ListInConstr.ListInContr(Boolean, System.Collections.Generic.List`1[System.String])
    >>> from System.Collections.Generic import List
    >>> from System import String
    >>> arg2=List[String]() #do not add elements here
    >>> ListInConstr(True,arg2)
    <ListInConstr.ListInConstr object at 0x0284E890>
    >>>

    Je n'ai pas de C:\Debug\ListInConstr , et une recherche sur ListInConst ne donne rien.

    Vous savez comment convertir une liste Python vide en .NET ?

    Merci…

    --
    Darckense

    • [^] # Re: Créer une liste en .NET depuis Python ?

      Posté par . Évalué à 5.

      Dans l'exemple donné sur SO, tu as 2 parties :
      1. La première consiste à écrire du code pour convertir ta liste. Ce code est à écrire en C# et à compiler pour obtenir un fichier DLL (y compris sous linux)
      1. La deuxième consiste à utiliser cette DLL en y faisant référence. L'auteur de la réponse a supposé qu'elle était présente dans C:\Debug\ListInConstr

      Si j'ai bien compris, tu n'as appliqué que la 2ème partie, c'est pour ça que ça ne marche pas. Par contre, j'avoue ne pas comprendre non plus à quoi sert la 1ère partie.

      Vous savez comment convertir une liste Python vide en .NET ?

      Si la liste que tu veux passer est vide, c'est peut-être plus simple de créer directement une List .NET vide que de convertir une liste python.

      Je ne connais rien à PythonNet mais d'après le readme ça pourrait donner quelque chose comme :

      from PrincetonInstruments.LightField.Automation import Automation
      from System.Collections.Generic import List
      from System import *
      l = List[String]()
      instance = Automation(True,l)
      • [^] # Re: Créer une liste en .NET depuis Python ?

        Posté par (page perso) . Évalué à 1.

        Je te plussois infiniment. CA MARCHE ! :-) (Et désolé de ne pas avoir répondu avant, je n'avais pas accès à la manip le WE).

        Merci beaucoup. C'était bêtement une erreur de type Python/.NET. Je vais lire le readme de pythonnet en détail pour savoir comment convertir le tout proprement pour les autres commandes, mais à partir de la, je devrais me débrouiller.

        Si je suis en forme et que ça fonctionne, je posterais le code Python si cela intéresse quelqu'un d'autre.

        Encore une fois, merci à tous pour votre aide et vos conseils.

        --
        Darckense

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.