probleme avec les packages.

probleme avec les packages. - Python - Programmation

Marsh Posté le 16-03-2004 à 21:31:10    

voila je vous presente la probleme. je suis entrain de faire un moteur de plugin. et j'ai commencer a coder une methode qui doit charer les plugins. seulement les plugin je veux qu'ils soient dans un dossier separer appeler "plugin"

Code :
  1. def loadPlugIns (self):
  2.        # je liste le contenu du repertoir plugin
  3.        list = os.listdir("plugin" )
  4.        
  5.        #je verifie si les fichier contenu dans le repetoire
  6.        # son des fichier valide
  7.         for file in list:
  8.             if file.endswith(".py" ) and not file == "__init__.py":
  9.                
  10.                 # je recupere la partie devant le point du fichier
  11.                 mod = file.split("." )[0]
  12.                
  13.                 # je voudais importer le module.
  14.                 # mais ça plante car je n'est pas specifier
  15.                 #le package plugins.
  16.                 #si je le specifie ça plante aussi
  17.                 # en faite c la qu'est mon probleme
  18.                 mod = __import__(mod)
  19.                 try:
  20.                     # comme ça yahoo, je creer un objet ini
  21.                     #(le plug in)
  22.                     self.__listplug__.append(mod.init())
  23.                 except AttributeError:
  24.                     pass


 
 
dans les fait tout marche sauf la redirection vers le package plugin. ce qui m'emmerde un peu faut l'avouer.  
donc voila je bloque un peu la. donc si quelqu'un avais une petite idéé du probleme, ça m'eviterais peu etre quelques nuit blanche :)  
voila, merci d'avance :)
 

Reply

Marsh Posté le 16-03-2004 à 21:31:10   

Reply

Marsh Posté le 16-03-2004 à 21:44:54    

1) list est réservé, donc ne pas l'utiliser. file aussi
for f in os.listdir() sera bien meilleur
2) utilise le truc de os.path pour couper base.extension
3) ça veut dire quoi ça plant ?

Reply

Marsh Posté le 16-03-2004 à 21:55:26    

Taz a écrit :

1) list est réservé, donc ne pas l'utiliser. file aussi
for f in os.listdir() sera bien meilleur
2) utilise le truc de os.path pour couper base.extension
3) ça veut dire quoi ça plant ?


merci pour les conseils. je vais arranger ça.
sinon le "ça plante" c'est j'ai un dossier dans lequel j'ai des fichier pythons (mes plugins) je reussi a lister le contenu du dossier, mais je ne peux pas acceder a mes fichier python pour faire un import.
en d'autre terme si je remplcae ça:

Code :
  1. mod = file.split("." )[0]


par ça

Code :
  1. mod ="plugin."+file.split("." )[0]


ça ne marche pas. il me fais un beaux Importe error je crosi bien :)
 

Reply

Marsh Posté le 16-03-2004 à 22:00:28    

commence par vérifier que les noms a importer sont comme il faut.
sinon y a rien à dire, tu merde ailleurs. si ça ne marche pas, dans un shell import machin.bidule échoue également

Reply

Marsh Posté le 16-03-2004 à 22:08:23    

Taz a écrit :

commence par vérifier que les noms a importer sont comme il faut.
sinon y a rien à dire, tu merde ailleurs. si ça ne marche pas, dans un shell import machin.bidule échoue également


hum, ok pas cool. je vais continuer a chercher.
c quoi cette histoire de os.path pour decouper en base.extension? juste histoire de pas m'endormir trop con ce soir :)
En faite si je peux faire mieux alors j'essaye de faire :)

Reply

Marsh Posté le 16-03-2004 à 22:09:33    

T'as vérifié avant d''importer si le nom de fichiers est correct? Avec un print mod?
Moi je vois plutôt un :

Code :
  1. mod = 'plugin.'+os.path.splitext(file)[0]


Message édité par chaica le 16-03-2004 à 22:10:56
Reply

Marsh Posté le 16-03-2004 à 22:23:50    

il est tout ce qu'il ya de plus correcte. le pire c'est que j'ai fais tester le

Code :
  1. import plugin.tesplugin

et ça marche. ( le testplugin etant un fichier de teste. :)

Reply

Marsh Posté le 16-03-2004 à 22:26:12    

lunatik3 a écrit :

il est tout ce qu'il ya de plus correcte. le pire c'est que j'ai fais tester le

Code :
  1. import plugin.tesplugin

et ça marche. ( le testplugin etant un fichier de teste. :)

enfin quoi que le import ne marche pas tan que ça en faite.

Reply

Marsh Posté le 16-03-2004 à 22:27:33    

Tu peux copier coller ton message d'erreur là?

Reply

Marsh Posté le 16-03-2004 à 22:29:57    

E:\prog\python>plugin.py
Traceback (most recent call last):
  File "E:\prog\python\plugin.py", line 84, in ?
    plugM.loadPlugIns()
  File "E:\prog\python\plugin.py", line 70, in loadPlugIn
    mod = mod.init()
AttributeError: 'module' object has no attribute 'init'
c'est un attribut error.
 
c'est quand je retire le try catch

Reply

Marsh Posté le 16-03-2004 à 22:29:57   

Reply

Marsh Posté le 16-03-2004 à 22:31:13    

ben y a pas d'init() dans ton module, cai tout

Reply

Marsh Posté le 16-03-2004 à 22:32:41    

Tu veux pas te servir du module imp et de la fonction load_module ?

Reply

Marsh Posté le 16-03-2004 à 22:33:46    

bah __import__ est une fonction de base qui fonctionne très très bien d'un autre côté. cela dit, il faut tester toutes les possibilités

Reply

Marsh Posté le 16-03-2004 à 22:35:31    

J'espère que le monsieur il a un init() dans son module :D

Reply

Marsh Posté le 16-03-2004 à 22:36:09    

Taz> je cherche a acceder au fichier testplugin qui ce trouve dans mon repertoire plugin. et dans ce fichier la il ya un init c'est certain.  
chaica> a quoi servirais la methode load_module. j'y ai deja jeté un coup d'oeil, mais je sais pas trop a quoi ça sert. (faut dire je suis pas une super bete en anglais a mon plus grand maleur.)

Reply

Marsh Posté le 16-03-2004 à 22:38:15    

Taz> ben tu foires à un endroit, parce que tout ça marche très bien
 
quand tu fais  
 
mod == __import__
 
rajoure un  
 
print mod

Reply

Marsh Posté le 16-03-2004 à 22:39:59    

lunatik3 a écrit :

Taz> je cherche a acceder au fichier testplugin qui ce trouve dans mon repertoire plugin. et dans ce fichier la il ya un init c'est certain.  
chaica> a quoi servirais la methode load_module. j'y ai deja jeté un coup d'oeil, mais je sais pas trop a quoi ça sert. (faut dire je suis pas une super bete en anglais a mon plus grand maleur.)


 
Ben à loader ton module. Je balance un peu toutes les soluces qui me passent par la tête hein...
Tu catches une exception autour de ton import? Si non c'est que tout se passe bien au niveau de l'import. T'as les bons droits sur le fichier?

Reply

Marsh Posté le 16-03-2004 à 22:41:43    

Taz a écrit :

Taz> ben tu foires à un endroit, parce que tout ça marche très bien
 
quand tu fais  
 
mod == __import__
 
rajoure un  
 
print mod


vala un petit print mod:

Code :
  1. E:\prog\python>plugin.py
  2. <module 'plugin' from 'E:\prog\python\plugin\__init__.pyc'>
  3. <module 'plugin' from 'E:\prog\python\plugin\__init__.pyc'>
  4. <module 'plugin' from 'E:\prog\python\plugin\__init__.pyc'>


 
si ça ce trouve il ya un truc qui deconne au niveau du __init__.py

Reply

Marsh Posté le 16-03-2004 à 22:43:32    

chaica a écrit :


 
Ben à loader ton module. Je balance un peu toutes les soluces qui me passent par la tête hein...
Tu catches une exception autour de ton import? Si non c'est que tout se passe bien au niveau de l'import. T'as les bons droits sur le fichier?


je bosse sous wndows. donc les droit je les ai.
je catch pas d'exception autour de mon importe, mais ça peut etre une idée pour plus tard :)

Reply

Marsh Posté le 16-03-2004 à 22:43:43    

ben non. t'as importé le package plugin, et dedans il n'y a pas de fonction
 
 
repertoire avec un __init__.py -> package
fichier.py -> module

Reply

Marsh Posté le 16-03-2004 à 22:47:25    

Taz a écrit :

ben non. t'as importé le package plugin, et dedans il n'y a pas de fonction
 
 
repertoire avec un __init__.py -> package
fichier.py -> module


 
donc comment je fais pour recuperer mes class du module testplug qui ce trouve dans plugin? stp :) parce que la je nage un peu. je sens qu'on est pas loin. :)

Reply

Marsh Posté le 16-03-2004 à 22:48:19    

ben import plugin.testplug

Reply

Marsh Posté le 16-03-2004 à 22:48:25    

En tout cas catcher OSError autou de os.listdir() ce sera une bonne idée.

Reply

Marsh Posté le 16-03-2004 à 22:50:58    

chaica a écrit :

En tout cas catcher OSError autou de os.listdir() ce sera une bonne idée.


 
ok je ferais ça.  
 
 
Taz> en faite meme pas j'ai deja tester. l'import ce fais sans pb mais il trouve pas de init().  
 
de plus c bon quand on sais comment s'appelle le plugin. mais quand on veut gerer l'import dynamiquement c pas super cool.

Reply

Marsh Posté le 16-03-2004 à 22:51:57    

chezmoiçamarche

Reply

Marsh Posté le 16-03-2004 à 22:58:59    

alors ça ; ça marche:

Code :
  1. import plugin.testplug
  2.         mod = plugin.testplug.init()


mais comment je fais pour faire un import non static mais dynamqiue alors. je connais pas a l'avances tout les plug-ins contenu dans plugin. je me retrouve avec le pb du debut. avec load_module?

Reply

Marsh Posté le 16-03-2004 à 23:00:05    

ben en listant, ça marche très bien

Reply

Marsh Posté le 16-03-2004 à 23:03:59    

Taz a écrit :

ben en listant, ça marche très bien


seulement le import ne marhe qu'avec des nom en dure ( genre plugin.testplug) mai spas avec une variable.  
genre  
 
f = 'plugin.testplug'
import f.  
et si j'utilise __import__(f) vous avez vu ça deconne

Reply

Marsh Posté le 16-03-2004 à 23:09:22    

benoit@athlon >>> python plugin.py moule
moule.coin      Ah bas les moules!
moule.plop      Pan! Pan!

Reply

Marsh Posté le 16-03-2004 à 23:11:04    

lunatik3 a écrit :


et si j'utilise __import__(f) vous avez vu ça deconne

c'est toi qui déconne. écoute, print le mod que tu récupère avec l'__import__ et voilà.
 
si tu fais import a.b
 
ben tu accèdes toujours à a.b en utilsant a.b comme écriture
 
donc mod.f() c'est pas plugin.truc.f()

Reply

Marsh Posté le 16-03-2004 à 23:11:49    

Taz a écrit :

benoit@athlon >>> python plugin.py moule
moule.coin      Ah bas les moules!
moule.plop      Pan! Pan!


???   kezako?

Reply

Marsh Posté le 16-03-2004 à 23:18:36    

Taz a écrit :

c'est toi qui déconne. écoute, print le mod que tu récupère avec l'__import__ et voilà.
 
si tu fais import a.b
 
ben tu accèdes toujours à a.b en utilsant a.b comme écriture
 
donc mod.f() c'est pas plugin.truc.f()


 
oui mais moi a la base j'en sais rien ce qu eje vais trouver dans le repertoire plugin. (enfin moi je sais le programme: non)  
si j'ai bien compris pour acceder en static  (parce que je sais qu'il ce trouve la) a testplug je fais un import.  
 
maintenant si je liste le contenu de plugin avec os.listdir("plugin" )
il va pas trop aimer un import  
 
enfin je sais pas si je deconne pou pas. c possible en tout cas. je vois pas ce que je pourrais faire avec import dans le cas present. import je peux l'utiliser qu'avec les chemins deja connu avant execution.

Reply

Marsh Posté le 16-03-2004 à 23:19:52    

lunatik3 a écrit :


 
oui mais moi a la base j'en sais rien ce qu eje vais trouver dans le repertoire plugin. (enfin moi je sais le programme: non)  
si j'ai bien compris pour acceder en static  (parce que je sais qu'il ce trouve la) a testplug je fais un import.  
 
maintenant si je liste le contenu de plugin avec os.listdir("plugin" )
il va pas trop aimer un import  
 
enfin je sais pas si je deconne pou pas. c possible en tout cas. je vois pas ce que je pourrais faire avec import dans le cas present. import je peux l'utiliser qu'avec les chemins deja connu avant execution.


 
sur ce je vais me coucher j'ai veiller plus que je ne voulais (meme si je sais ok c toi, mais je suis naze)
je reprendrai le pb demain matin. enfin merci beaucoup de votre aide a vous 2.

Reply

Marsh Posté le 16-03-2004 à 23:20:04    

moule/coin.py
def hello():
    print 'Ah bas les moules!'
moule/__init__.py
moule/plop.py
def hello():
    print 'Pan! Pan!'
 
 
mais moi non plus

Reply

Marsh Posté le 17-03-2004 à 09:26:37    

j'ai finis par trouver la solution. reste plus qu'a bien securiser le tout:

Code :
  1. def loadPlugIns (self):
  2.         for f in os.listdir("plugin" ):
  3.             if f.endswith(".py" ):
  4.                 f = 'plugin.'+os.path.splitext(f)[0]
  5.                 mod = __import__(f,globals(),locals(),['init'])
  6.                 try:
  7.                     mod = mod.init()
  8.                     self.__listplug__[f] = mod
  9.                 except AttributeError:
  10.                     pass


voila.

Reply

Marsh Posté le 17-03-2004 à 10:05:32    

1) je crois pas que ça marche ça
2) dégage vite ce nom à la con __listplug__
3) en fait ça marche avec un effet de bord à la con

Reply

Marsh Posté le 17-03-2004 à 10:52:34    

Taz a écrit :

1) je crois pas que ça marche ça
2) dégage vite ce nom à la con __listplug__
3) en fait ça marche avec un effet de bord à la con


un effet de bord?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed