Pages : 1
#1 Le 16/12/2013, à 06:35
- GP974
Python import conditionel
Bonjour voila un petit problème dans un de mes script python
J'ai plusieurs xml de conception différent a parser et a extraire les information dans un dossier (actuellement 3 mais il y en aura bien d'autre plus tard)
Pour ce qui est des parsage des xmls en eux même aucun problème mes scripts sont prêt et fonctionnel mon but est de parser tous les xml de mon dossier je fonctionne donc comme ca
arborescence
.script principal
./Parseur/.
mes diffèrent script python pour parser
./Xml/
mes différent xml
ce que je voudrait faire dans mon script principal c'est il cherche les différents xml du dossier parseur si il en trouve un exemple toto.xml il utilise toto.py pour le parser en gros "name".xml il utilise "name".py pour parser
le listing de tous les xml de dossier parseur c'est ok la ou ca coince c'est l'importation du bon script qui correspond au xml dans mon script principal
jai penser a un truc du genre mais ca ne fonctionne pas
if os.path.isfile("Xml/" + Nom + ".xml"):
print "Ton fichier existe"
p = "./Parseur/" + Nom + ".py"
import p as ParseurActuel
l'erreur ImportError: No module named p
donc si je comprend bien il n’interprète pas p comme étant une variable ( bien sur le fichier python correspondant existe bien) si je met le nom manuellement ca fonctionne mais moi je veut quelque chose de dynamique
En gros je veut faire un import conditionnel en fonction d'une variable est ce possible (pas trouve de solution)
sinon quelqu'un voit un moyen simple de résoudre mon problème sans utiliser d'import ?
En espérant que ce soit clair
Merci
Hors ligne
#2 Le 16/12/2013, à 07:12
- pingouinux
Re : Python import conditionel
Bonjour,
Ce n'est pas exactement la même chose, mais tu peux essayer ceci :
python2 ou 3
exec(open(p).read())
python2
execfile(p)
Ajouté :
Ou mieux (en python 2 ou 3)
exec('import '+p+' as ParseurActuel')
Dernière modification par pingouinux (Le 16/12/2013, à 08:09)
Hors ligne
#3 Le 16/12/2013, à 08:01
- GP974
Re : Python import conditionel
hum dans le script que j'importe en question je dois exécuter la fonction createHost qui me retourne un objet host si je copie colle ta ligne il ne me fais rien ( car je suposse qu'il n'appelle pas ma fonction spécifique)
donc avec ton système il est possible d’appeler une fonction spécifique ( qui existe dans tous les fichiers) et recuperer le retour de celle-ci ?
edit je teste ta solution numéro 2
Dernière modification par GP974 (Le 16/12/2013, à 08:02)
Hors ligne
#4 Le 16/12/2013, à 08:17
- GP974
Re : Python import conditionel
j'ai testé la solution numero 2
Traceback (most recent call last):
File "./Rapport.py", line 39, in <module>
HostActuel=ParseurActuel.createHost()
File "/xxx/xxx/xxx/xxx/xxx/xxx.py", line 71, in createHost
MyHost=ObjectHost.Host()
NameError: global name 'ObjectHost' is not defined
ObjectHost est definis dans mon script principal avec
import Host as ObjectHost
j'ai essayer aussi de l'ajouter juste avant la ligne qui plante même message d'erreur
def createHost():
import Host as ObjectHost
MyHost=ObjectHost.Host()
print "debut"
ListeAdresse=xmldoc.getElementsByTagName("address")
for Adresse in ListeAdresse:
if Adresse.attributes["addrtype"].value == "ipv4":
MyHost.ip = Adresse.attributes["addr"].value
if Adresse.attributes["addrtype"].value == "mac":
MyHost.adresseMac = Adresse.attributes["addr"].value
MyHost.port = CreerTabPort()
return MyHost
Bien sur le fichier Host est bien definis et ne plante pas dans le script principal
Dernière modification par GP974 (Le 16/12/2013, à 08:26)
Hors ligne
#5 Le 16/12/2013, à 08:51
- pingouinux
Re : Python import conditionel
Là, je ne vois pas. T'est-il possible d'élaguer le script en ne laissant que le strict minimum pour reproduire l'erreur ?
Hors ligne
#6 Le 16/12/2013, à 09:01
- GP974
Re : Python import conditionel
ok
j'ai un peu modifier mon script ente temps et j'ai élaguer mais toujours le même problème
donc
le principal
#!/usr/bin/python
import os
import Host as ObjectHost
import sys as systemif len(system.argv) < 2:
system.exit(1)
Nom = system.argv[1]
Chemin = ""
if os.path.isfile("./Parseur/" + Nom + ".py"):
print "Ton fichier existe"
else:
print "Ton fichier n'existe pas"
system.exit(1)
if not os.path.isfile("./Parseur/.LastLog"):
print "Imposible de continuer"
else:
with open("./Parseur/.LastLog", 'r') as CheminLog:
CheminLog = open("./Parseur/.LastLog", "r")
Chemin = CheminLog.read().rstrip('\n\r')
CheminLog.close()p =""
HostActuel=ObjectHost.Host()
print Chemin + "/" + Nom + ".xml"
if os.path.isfile(Chemin + "/" + Nom + ".xml"):
print "Ton fichier existe"
exec('import '+Nom+' as ParseurActuel')
HostActuel=ParseurActuel.DebutParseur()
print HostActuel.ip
le fichier "ParseurActuel"
#!/usr/bin/python
import Host as ObjectHost
from xml.dom import minidomdef CreerHost():
import Host as ObjectHost
MyHost=ObjectHost.Host()
print "debut"
ListeAdresse=xmldoc.getElementsByTagName("address")
for Adresse in ListeAdresse:
if Adresse.attributes["addrtype"].value == "ipv4":
MyHost.ip = Adresse.attributes["addr"].value
if Adresse.attributes["addrtype"].value == "mac":
MyHost.adresseMac = Adresse.attributes["addr"].valuereturn MyHost
def DebutParseur():
xmldoc = minidom.parse('./test.xml')
Host=CreerHost()return Host
et l'object Host
class Host:
def __init__(self):
self.ip = ""
self.hostname = ""
self.adresseMac = ""
#self.port = list()
Hors ligne
#7 Le 16/12/2013, à 09:31
- pingouinux
Re : Python import conditionel
Dans le principal, il y a une incompatibilité entre
if os.path.isfile("./Parseur/" + Nom + ".py"):
et
exec('import '+Nom+' as ParseurActuel')
Il ne sait pas où chercher le module.
Hors ligne
#8 Le 16/12/2013, à 09:53
- GP974
Re : Python import conditionel
ah oui j'ai copier mon fichier pour les test je l'ai mis au même niveau que le fichier principal car justement il ne le trouvait pas au depart
ensuite il le trouve mais il y a l'erreur du post précédent
edit
j'ai effacer tous les fichier .pyc
relancer tous le projet il ne me fais plus la meme erreur
bon maintenant on as
Traceback (most recent call last):
File "./Rapport.py", line 31, in <module>
HostActuel=ParseurActuel.DebutParseur()
NameError: name 'ParseurActuel' is not defined
p =""
HostActuel=ObjectHost.Host()
print Chemin + "/" + Nom + ".xml"
if os.path.isfile(Chemin + "/" + Nom + ".xml"):
print "Ton fichier existe"
exec('import '+Nom+' as ParseurActuel')
HostActuel=ParseurActuel.DebutParseur()
print HostActuel.ip
c'est le même code que le haut je vois pas ou est l'erreur je ne croit pas que cette ligne fonctionne ..
exec('import '+Nom+' as ParseurActuel')
Dernière modification par GP974 (Le 16/12/2013, à 10:06)
Hors ligne
#9 Le 16/12/2013, à 10:06
- pingouinux
Re : Python import conditionel
J'ai testé en élaguant encore un peu, en mettant les .py au même niveau, et ça marche chez moi. Peux-tu montrer tes fichiers simplifiés exactement comme tu les utilises ?
Hors ligne
#10 Le 16/12/2013, à 10:20
- GP974
Re : Python import conditionel
Peux-tu montrer tes fichiers simplifiés exactement comme tu les utilises ?
c'etait les fichiers du post
mais bon j'ai encore élaguer
ça fonctionne enfin mais ca ne fais plus grand chose
je part de la si ca coince je reviendrait
le code qui fonctionne actuellement avec tous les fichiers au même niveau
#!/usr/bin/python
import os
import Host as ObjectHost
import sys as systemif len(system.argv) < 2:
system.exit(1)
Nom = system.argv[1]
HostActuel=ObjectHost.Host()
exec('import '+Nom+' as ParseurActuel')
HostActuel=ParseurActuel.DebutParseur()
print HostActuel.ip#!/usr/bin/python
import Host as ObjectHost
from xml.dom import minidomdef CreerHost():
import Host as ObjectHost
MyHost=ObjectHost.Host()
print "debut"
return MyHostdef DebutParseur():
xmldoc = minidom.parse('./test.xml')
Host=CreerHost()return Host
#!/usr/bin/python
class Host:
def __init__(self):
self.ip = ""
self.hostname = ""
self.adresseMac = ""
self.port = list()
Hors ligne
#11 Le 16/12/2013, à 10:26
- pingouinux
Re : Python import conditionel
Il faudra donc voir si ça coince de nouveau. Sinon, si le module correspondant à ParseurActuel est dans le répertoire Parseur, tu peux ajouter cette ligne après import sys as system
system.path.append('./Parseur')
Hors ligne
#12 Le 16/12/2013, à 10:28
- GP974
Re : Python import conditionel
hum voila donc j'ai remis mes ligne de code pas a pas c'est le fais de mettre cette ligne das le if qui coince tous
ceci fonctionne
print Chemin + "/" + Nom + ".xml"
HostActuel=ObjectHost.Host()
exec('import '+Nom+' as ParseurActuel')
HostActuel=ParseurActuel.DebutParseur()
cela non
print Chemin + "/" + Nom + ".xml"
if os.path.isfile(Chemin + "/" + Nom + ".xml"):
HostActuel=ObjectHost.Host()
exec('import '+Nom+' as ParseurActuel')
HostActuel=ParseurActuel.DebutParseur()
je comprend pas tu as une explication ?
en tous cas merci beaucoup pour l'aide
Hors ligne
#13 Le 16/12/2013, à 10:35
- pingouinux
Re : Python import conditionel
La variable Chemin est-elle correcte ? Notamment, le résultat de print Chemin + "/" + Nom + ".xml" ne doit pas commencer par un "/".
Hors ligne
#14 Le 16/12/2013, à 10:36
- GP974
Re : Python import conditionel
ok j'ai compris dans mon dossier indiquer par le "Chemin"
Mon fichier commence par une minuscule au lieu d'une majuscule *pan*
je vais me pendre je reviens ...
bon après avoir un gros nettoyage et changer cette faute tous fonctionne
Merci
Hors ligne
#15 Le 16/12/2013, à 21:42
- tiramiseb
Re : Python import conditionel
Salut,
Je n'aime pas trop l'approche « exec » de pingouinux.
Plus propre en Python, si tu veux importer quelque chose en utilisant le contenu d'une chaîne, utilise __import__ ou, à partir de Python 2.7, importlib.import_module.
http://docs.python.org/2/library/import … ort_module
http://docs.python.org/2/library/functi … __import__
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#16 Le 16/12/2013, à 22:03
- pingouinux
Re : Python import conditionel
@tiramiseb : Je ne connaissais pas, je regarde.
Hors ligne
#17 Le 16/12/2013, à 22:07
- tiramiseb
Re : Python import conditionel
Heeeeh, un truc de dev sur lequel j'en connais + que pingouinux !!!
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#18 Le 16/12/2013, à 22:15
- pingouinux
Re : Python import conditionel
Heeeeh, un truc de dev sur lequel j'en connais + que pingouinux !!!
Ce n'est pas bien difficile
Hors ligne
#19 Le 16/12/2013, à 22:16
- tiramiseb
Re : Python import conditionel
tiramiseb a écrit :Heeeeh, un truc de dev sur lequel j'en connais + que pingouinux !!!
Ce n'est pas bien difficile
En tout cas en shellscript il semble que tu m'es supérieur
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
Pages : 1