IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Accès aux modules dans arborescence de répertoires


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut Accès aux modules dans arborescence de répertoires
    Bonjour,

    Je travaille actuellement sur un projet en python 3.x qui va probablement finir par accueillir un grand nombre de fichiers.
    Donc j'ai créé des sous-répertoires dans mon arborescence principalement pour éviter le fouillis du répertoire unique et peut être à terme crée des sous modules.

    A chaque répertoire, je crée donc le fameux fichier __init__.py pour la reconnaissance. Par contre je remarque que à partir d'un répertoire pour pourvoir accéder à n'importe quel fichier je dois faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import racine.sous-répertoire1.sous-répertoire2.mon_module.
    Sachant que le projet est jeune et que l'organisation des répertoires et des fichiers peut évoluer légèrement au cours du temps (en profitant des fonctionnalités de SVN qui le permet).
    Ce "dépointage" pour l'accès aux modules peut poser problème dans le cas de déplacement de fichiers.

    A part modifier le PYTHONPATH avec tous les répertoires ce qui devient relativement lourds, y-a-il un moyen propre de supprimer ce "dépointage" de répertoire?

    Je pense qu'il faudrait utiliser le fichier __init__.py de la racine du projet.
    Existe-il une manière standard de le faire?

    Merci

  2. #2
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Salut

    Si j'ai bien compris, tu dois pouvoir trouver tous les modules quoi qu'il arrive.

    Dans ce cas, tu serais peut-être intéressé par __import__.
    L'idée serait d'explorer toute ton arborescence de fichiers, et faire des imports en conséquence.

    Je n'ai plus joué avec __import__ depuis longtemps, mais ceci devrait t'aider (pour peu que ce soit juste...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from Aspyct.core import py2x
    # Equivaut à
    _imp = __import__('Aspyct.core', globals(), locals(), ['py2x'])
    py2x = _imp.py2x

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut
    merci de ta réponse,

    Mais je suis encore un peu perplexe car faire un
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from toto.tata import titi
    Je ne vois pas trop la différence. A moins que j'ai zappé quelque chose dans ton explication.

    Je précise donc mon problème avec un exemple d'aborescence:

    project
    |--core
    | |--data
    | | |-dta_type.py
    | | |-dta_mngt.py
    | |
    | |--process
    | | |-process.py
    |
    |--specific

    si je déclare dans PYTHONPATH le répertoire racine project
    si je suis dans le module process.py, pour accéder à "dta_mngt" je dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import core.data.dta_mngt
    #ou
    from core.data import dta_mngt
    le problème est comme le projet "grandis" je vais avoir un nombre de fichier croissant, et je devrais probablement réorganisé mes fichiers au fur et à mesure. Je le faisais en C car avec des milliers de fichiers de code il faut quelque fois ranger pour des raisons de cohérence (fichier mal positionné dans une arborescence)

    si mon fichier dta_mngt.py change de répertoire
    exemple :
    project\core\data\dta_mngt.py
    vers
    project\core\program\data\dta_mngt.py

    Donc je devrais modifier fichiers pour modifier l'import
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import core.program.data.dta_mngt
    je voulais donc savoir s'il était possible d'avoir dans le code quelque chose du genre
    pour cela faut-il :
    - jouer avec le PYTHONPATH et inclure tous les répertoires?
    - jouer avec les __init__.py des différents répertoire pour que l'accès au différents fichiers soit vus de n'importe quel endroit

  4. #4
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par ledannois Voir le message
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from toto.tata import titi
    Je ne vois pas trop la différence. A moins que j'ai zappé quelque chose dans ton explication.
    Euh ? Ce n'est pas du tout la même chose, hormis qu'au final, les modules sont importés.

    Mais ce que je voulais pointer ici, ce n'est pas le from x import y, mais bien la fonction __import__ qui te permet de faire des imports arbitraires.


    si mon fichier dta_mngt.py change de répertoire
    exemple :
    project\core\data\dta_mngt.py
    vers
    project\core\program\data\dta_mngt.py

    Donc je devrais modifier fichiers pour modifier l'import
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import core.program.data.dta_mngt
    je voulais donc savoir s'il était possible d'avoir dans le code quelque chose du genre
    Depuis l'orienté objet et l'existence des packages, la déplacement d'un fichier requiert la mise à jour des liens. (Note: aucune classe ne devrait soudainement sauter d'un package à l'autre dans un système opérationnel...)

    Toutefois il est possible d'arriver à faire ce que tu demandes avec un peu de manipulation.
    Il y a pas mal de pistes possibles:
    1. Ajouter des dossier dans sys.path: http://docs.python.org/library/sys.html#sys.path (ou de fait directement à PYTHONPATH avant l'exécution du script)
    2. Modifier le comportement d'import (je te le déconseille fortement toutefois...): http://docs.python.org/library/imp.html Vois aussi les démos dans les package sources de python.
    3. Te servir de la technique évoquée plus haut
    4. Parcourir récursivement tous tes dossiers de sources, tout importer et aller chercher tes modules dans sys.modules
    5. Créer une sorte de 'gestionnaire de module', à qui tu demanderais tel ou tel module, et qui s'occuperait lui-même de les charger en mémoire, puis les retournerait.

    etc... A toi de choisir la meilleure solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Droits d'acces aux fichiers dans dossier en partage
    Par catoucat dans le forum Windows XP
    Réponses: 3
    Dernier message: 03/07/2006, 02h47
  2. Réponses: 3
    Dernier message: 09/06/2006, 15h41
  3. [VBA-E]Accès aux modules via VBA
    Par houba95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/03/2006, 22h10
  4. Réponses: 2
    Dernier message: 15/02/2006, 17h35
  5. [Noyau] Accès aux blocks dans le buffer cache
    Par gtaoufik dans le forum Oracle
    Réponses: 12
    Dernier message: 26/08/2005, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo