Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
963 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Python for .NET et héritage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Python for .NET et héritage

n°1133875
theshockwa​ve
I work at a firm named Koslow
Posté le 28-06-2005 à 16:40:10  profilanswer
 

je viens de me mettre à utiliser Python for .Net (http://www.zope.org/Members/Brian/PythonNet) et j'ai un petit souci ... J'aurais besoin de faire communiquer l'appli et je pensais à une méthode qui me semblait assez élégante dans le principe :
 
du côté python :

Code :
  1. def startDL(stats):
  2. stat = {'updated':  'true'}
  3. stats.update(stat)


 
avec l'objet passé en tant que "stats" un objet purement C# dérivant de la classe PyObject proposée par la lib :
 

Code :
  1. public abstract class PyStatisticsUpdater : PyObject
  2. {
  3. // correctly forward the method calls
  4. new public PyObject InvokeMethod(string name, params PyObject[] args)
  5. {
  6.  if(name == "update" )
  7.   return update(new PyDict(args[0]));
  8.  return base.InvokeMethod(name, args);
  9. }
  10. new public PyObject InvokeMethod(string name, PyTuple args)
  11. {
  12.  if(name == "update" )
  13.   return update(new PyDict(args.GetItem("newStats" )));
  14.  return base.InvokeMethod(name, args);
  15. }
  16. new public PyObject InvokeMethod(string name, PyObject[] args, PyDict kw)
  17. {
  18.  if(name == "update" )
  19.   if(args.Length<1)
  20.    return update(new PyDict(kw.GetItem("newStats" )));
  21.   else
  22.    return update(new PyDict(args[0]));
  23.  return base.InvokeMethod(name, args, kw);
  24. }
  25. new public PyObject InvokeMethod(string name, PyTuple args, PyDict kw)
  26. {
  27.  if(name == "update" )
  28.   if(args.Length()<1)
  29.    return update(new PyDict(kw.GetItem("newStats" )));
  30.   else
  31.    return update(new PyDict(args[0]));
  32.  return base.InvokeMethod(name, args, kw);
  33. }
  34. public abstract PyObject update(PyDict newStats);
  35. }
  36. public class StatisticsUpdaterImp : PyStatisticsUpdater
  37. {
  38. override public PyObject update(PyDict newStats)
  39. {
  40.  string message = "--statistics :--\n\n";
  41.  for(int i=0; i<newStats.Keys().Length(); ++i)
  42.  {
  43.   string skey = newStats.Keys()[i].ToString();
  44.   message += skey + " =\n";
  45.   message += newStats.Keys()[i].ToString() + "\n\n";
  46.  }
  47.  MessageBox.Show(message);
  48.  return new Python.Runtime.PyInt(0);
  49. }
  50. }


 
le problème est bien évidemment d'arriver à faire un objet C# qui passe bien dedans les appels python.
 
Pour l'instant, je prends une exception avant même d'entrer dans le code python à vrai dire : je construis un dictionnaire python avec l'interface proposée par la lib, et l'ajout d'une instance de StatisticsUpdaterImp dans le dico lève une PythonException pas forcément très explicite
 
Je voulais simplement savoir si quelqu'un avait déjà tenté ce genre de subtilité (j'ai quelques doutes sur le fait que ce soit possible, à vrai dire) ou des remarques à me faire (étant donné que je ne suis à l'aise ni avec python, ni avec C# :sweat: )
 
merci d'avance.
 
Edit : ca pourra toujours être utile ... voilà les lignes qui conduisent à l'exception :

Code :
  1. PyDict argDict = new PyDict();
  2. argDict["destination"] = new PyString("c:\\temp\\" );
  3. argDict["stats"] = new StatisticsUpdaterImp();


Message édité par theshockwave le 28-06-2005 à 16:44:33
mood
Publicité
Posté le 28-06-2005 à 16:40:10  profilanswer
 

n°1133903
theshockwa​ve
I work at a firm named Koslow
Posté le 28-06-2005 à 16:55:44  profilanswer
 

Apparamment, le problème viendrait du fait que l'objet ne sait pas de quel type il est, je continue à chercher dans cette direction ... Toute suggestion est bienvenue, cependant :D

n°1134076
theshockwa​ve
I work at a firm named Koslow
Posté le 28-06-2005 à 19:07:35  profilanswer
 

Bon ... Mieux, encore, j'ai tenté de charger un module et e n'y parviens pas ... Si quelqu'un sait comment modifier une variable d'environnement en C#, je suis preneur.

n°1134591
theshockwa​ve
I work at a firm named Koslow
Posté le 29-06-2005 à 12:28:08  profilanswer
 

mbon, il semblerait qu'après la mise en place du hook d'imports (pour intercepter les imports de CLR), les imports "normaux" ne passent plus ...
 
En clair, soit je peux faire des imports sur du CLR, soit je peux faire des imports sur des modules python classiques ... mais pas les deux à la fois :/
 
Toujours personne qui connait le sujet ?

n°1136128
theshockwa​ve
I work at a firm named Koslow
Posté le 30-06-2005 à 16:10:33  profilanswer
 

De plus en plus précis :
 
Python for .Net remplace la fonction d'import de python (__builtin__.__import__) par un appel à une de ses fonctions statiques internes tout en gardant une référence sur la méthode normale d'import.
 
Ainsi, si on fait un import sur CLR.quelque chose, Python for .Net peut intercepter l'appel (si ca ne commence pas par CLR, il fait suivre la demande d'import à la méthode 'sauvegardée')
 
Le problème vient lorsque je demande à faire un import d'un module depuis mon code en C#, pourtant, le PythonEngine.Import() se contente d'appeler la lib python pour lui demander de faire l'appel à __builtin__.__import__ (qui pointe donc sur la fonction C# à ce moment là) et la méthode "foire" (j'ai encore du mal à comprendre tous les détails) dans ce cas là.
 
En revanche, si je vire le internal de la classe qui déclare le import en C# et que je l'utilise directement (donc plus de DLL intermédiaire), l'import fonctionne à merveille ...
 
Je me demande donc s'il n'y a pas une raison particulière que je ne connaitrais pas pour que cet appel échoue (je rappelle que la méthode import en C# fonctionne bien jusqu'à ce qu'on transmette l'appel à la DLL)

n°1153418
theshockwa​ve
I work at a firm named Koslow
Posté le 19-07-2005 à 10:54:51  profilanswer
 

theshockwave a écrit :

Si quelqu'un sait comment modifier une variable d'environnement en C#, je suis preneur.


 
 
si ca peut servir à quelqu'un ...
 
http://support.microsoft.com/defau [...] -us;829145

Citation :

SYMPTOMS
The System.Environment class has methods to read the environment variables. However, this class has no method to set the environment variables for the current process.


Citation :

STATUS
Microsoft has confirmed that this is a problem in the Microsoft products that are listed at the beginning of this article.


 :sweat:


Message édité par theshockwave le 19-07-2005 à 10:55:28
n°1153513
Taz
bisounours-codeur
Posté le 19-07-2005 à 11:53:07  profilanswer
 

priez pour qu'on tombe sur quelqu'un qui connaisse un peu C#, sinon on va encore bouffer du SetEnviron(key, value) ...

n°1153524
theshockwa​ve
I work at a firm named Koslow
Posté le 19-07-2005 à 11:59:31  profilanswer
 

explique ta vision des choses, parce que je découvre à peine le langage, là (et je dois avouer que j'ai du mal à voir sur quel point porte ta remarque)

n°1153539
Taz
bisounours-codeur
Posté le 19-07-2005 à 12:07:00  profilanswer
 

ben je l'ai déjà dit : y a la moitié des mecs qui font la bibli de .Net qui ont jamais fait de C#. C# propose des trucs sympatoches : surcharges de quelques opérateurs, et property.
 
Donc, on ne devrait plus jamais voir de get/set !
 
ici, on devrait avoir ça
 

Code :
  1. public class Env
  2. {
  3.   public string this[string key]
  4.     {
  5.       get
  6. {
  7.   System.Console.WriteLine("get[{0}]", key);
  8.   return "foo";
  9. }
  10.       set
  11. {
  12.   System.Console.WriteLine("set[{0}] = {1}", key, value);
  13. }
  14.     }
  15. }
  16. // pour pouvoir écrire       
  17. // env["blah"] = env["blih"] + "bar";


 
 
mais bon ne rêvons pas ... si tu regarder, y a plein de trucs pourris dans l'API, genre File.Get<machin>time(), etc, c'est loin d'être marginal ... c'est chiant

n°1153559
theshockwa​ve
I work at a firm named Koslow
Posté le 19-07-2005 à 12:18:29  profilanswer
 

Effectivement, je n'étais pas encore tombé sur ce genre de choses :/ Les quelques fonctionnalités que j'ai pu utiliser passaient bien par des properties, pour ma part.

mood
Publicité
Posté le 19-07-2005 à 12:18:29  profilanswer
 

n°1153568
Taz
bisounours-codeur
Posté le 19-07-2005 à 12:37:50  profilanswer
 

ben t'as qu'à regarver object ...

n°1153992
Taz
bisounours-codeur
Posté le 19-07-2005 à 17:44:21  profilanswer
 

bien encore, avec les stream binary, tu as un
 
int Length { get; }
 
et  
 
void SetLength(int) { } ...

n°1154006
theshockwa​ve
I work at a firm named Koslow
Posté le 19-07-2005 à 17:52:35  profilanswer
 

Joli, ... Joli ... Effectivement, ca fait assez mal de voir ca


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Python for .NET et héritage

 

Sujets relatifs
[.NET]Cloisonnement Applicatif ?Delphi - Heritage et TForm
C# vers VB .NETVisual .NET, MFC, boîte de dialogue et Rich Edit
Visual C++ 6 et Visual .NETVB.NET ComboBox et champ vide
[C++]Héritage de templates, g++ aime pas :(VB .NET : ComboBox et DataRow()
OpenGl dans une fenêtre définie avec visual .NetPortage de Linux vers windows
Plus de sujets relatifs à : Python for .NET et héritage


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR