Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/12/2013, à 07: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 tongue

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


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#2 Le 16/12/2013, à 08: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, à 09:09)

Hors ligne

#3 Le 16/12/2013, à 09: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, à 09:02)


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#4 Le 16/12/2013, à 09: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 hmm

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, à 09:26)


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#5 Le 16/12/2013, à 09: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, à 10: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 system

if 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 minidom

def 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"].value

    return 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()


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#7 Le 16/12/2013, à 10: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, à 10: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 roll

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 .. sad
exec('import '+Nom+' as ParseurActuel')

Dernière modification par GP974 (Le 16/12/2013, à 11:06)


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#9 Le 16/12/2013, à 11: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, à 11: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 lol
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 system

if 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 minidom

def CreerHost():

    import Host as ObjectHost
    MyHost=ObjectHost.Host()
    print "debut"
   
    return MyHost

def 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()


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#11 Le 16/12/2013, à 11: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, à 11: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 sad

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 smile


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#13 Le 16/12/2013, à 11: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, à 11: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


Ubunteros depuis 10.04 Restez libre avec Linux :)
Fixe : i7 i930@3.2ghz | DDR3 12go | Amd Rx580 | SSD - 120Go S2 | 14.04.05 & Arch
Fixe2 : I5 6500U@2.8ghz | DDR4 8GO | SSD 120 M2 | Arch
Développeur de nvidiux

Hors ligne

#15 Le 16/12/2013, à 22: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__

Hors ligne

#16 Le 16/12/2013, à 23:03

pingouinux

Re : Python import conditionel

@tiramiseb : Je ne connaissais pas, je regarde.

Hors ligne

#17 Le 16/12/2013, à 23:07

tiramiseb

Re : Python import conditionel

Heeeeh, un truc de dev sur lequel j'en connais + que pingouinux !!! lol

Hors ligne

#18 Le 16/12/2013, à 23:15

pingouinux

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 smile

Hors ligne

#19 Le 16/12/2013, à 23:16

tiramiseb

Re : Python import conditionel

pingouinux a écrit :
tiramiseb a écrit :

Heeeeh, un truc de dev sur lequel j'en connais + que pingouinux !!!

Ce n'est pas bien difficile smile

En tout cas en shellscript il semble que tu m'es supérieur tongue

Hors ligne