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 :

importation depuis dossier parent [Python 3.X]


Sujet :

Python

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Par défaut importation depuis dossier parent
    Bonjour,

    Je cherche à savoir comment faire une importation depuis le dossier parent (et si possible le plus simplement possible).

    J'ai déjà regardé pas mal de tutos sur internet, mais je finis toujours avec l'erreur :
    ImportError: attempted relative import with no known parent package

    Du coup, je ne comprend vraiment pas qu'est ce qui bloque...

    Si on part du principe que mon répertoire est comme suit et qu'on cherche à importer la classe a dans le fichier B.py :
    dossier_projet
    _A
    __A.py (contenant la classe a)
    _B
    __B.py (contenant la classe b)

    Comment est-il possible de faire dans le fichier B.py :
    d'après certains tutos (de ce que j'ai compris), il faut simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from ..A import a #(j'ai aussi essayé .A et ...A)
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sys.path.append("..")
    from A import a
    J'ai aussi essayé en ajoutant des fichiers __init__.py mais sans succès non plus .

    Merci d'avance à toutes les personnes qui seraient en mesure de m'aider.

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 178
    Par défaut
    hello,
    as-tu essayé ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import sys 
    sys.path.append('../A')
    from A import a
    Ami calmant, J.P

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut !
    Nom : Capture.PNG
Affichages : 2733
Taille : 88,6 Ko
    Voili, voilou !

    Edit : Oops, j'avais mal lu la problématique... J'ai corrigé le screenshot.
    Dernière modification par Invité ; 01/12/2021 à 13h03.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 602
    Par défaut
    Par curiosité, j'ai testé de mon côté et même constat que le demandeur du topic, en utilisant la même archi que lui : Python chouine pour une histoire de module not found.

    Plus curieusement, VisualStudioCode réagit normalement lorsque je tape from dossier parent import module et propose même l'autocomplétion. Le linter associé à VsCode n'indique aucune erreur dans mon code en procédant ainsi.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Par défaut
    jurassic pork
    Je n'avais pas essayé ainsi mais avec le code que tu proposes, j'obtiens un bon résultat.
    J'ai juste encore du mal à comprendre pourquoi je n'arrive pas à transposer sur mon projet...

    Mais en tout cas merci pour ta réponse, je devrai être capable (j'espère ) de trouver par moi-même ce qui bloque.

    LeNarvalo
    Merci pour ta réponse et pour le temps passé. Je pense que la solution doit effectivement ressembler à ça.

    Arioch
    C'est assez particulier...
    Personnellement je code avec spyder. Après j'imagine que même si ça marche avec VScode, il doit quand même y avoir un problème.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par thomas18F Voir le message
    J'ai déjà regardé pas mal de tutos sur internet, mais je finis toujours avec l'erreur :
    ImportError: attempted relative import with no known parent package
    Bizarre, normalement l'erreur (en Python3) serait plutôt "ValueError: attempted relative import beyond top-level package"

    Citation Envoyé par thomas18F Voir le message
    Du coup, je ne comprend vraiment pas qu'est ce qui bloque...

    Si on part du principe que mon répertoire est comme suit et qu'on cherche à importer la classe a dans le fichier B.py :
    dossier_projet
    _A
    __A.py (contenant la classe a)
    _B
    __B.py (contenant la classe b)

    Comment est-il possible de faire dans le fichier B.py :
    d'après certains tutos (de ce que j'ai compris), il faut simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from ..A import a #(j'ai aussi essayé .A et ...A)
    Bon, les imports j'ai aussi du mal mais j'y arrive à peu près, du moins en absolu (les relatifs j'ai jamais réussi, mais ça me manque pas)

    De ce que j'ai compris: un import absolu se base depuis la position du programme appelé. Donc si tu appelles "B.py", le programme se trouve sous le dossier "B" et démarre de là. Si tu tentes un truc comme import toto.X ou from toto import X il va chercher le dossier "toto" sous le dossier B, dossier de départ du programme. Et si tu tentes un from ..A import A comme j'ai fait, j'ai obtenu "ValueError: attempted relative import beyond top-level package" signifiant que je ne peux pas faire d'import relatif situé un niveau plus haut que le niveau où je me trouve (ici "B") étant considéré comme le "top level" (plus haut niveau possible), "A" lui est inaccessible.

    Toutefois il existe une variable sys.path contenant tous les chemins "en plus" depuis lesquels chercher les imports. Ainsi si l'import demandé (je parle toujours en absolu) ne se trouve pas dans sys.path[0] alors il sera cherché dans sys.path[1] et etc

    Donc ce que j'ai fait pour B.py
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/usr/bin/env python3
    # coding: utf-8
     
    import sys
    sys.path.append("..")
    from A import A
    A.fctA()

    Et pour A.py
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python3
    # coding: utf-8
     
    def fctA(): print("A")
    Et tout fonctionne.

    En ce qui concerne la remarque d'Arioch concernant VS là je n'en sais rien. Probablement que VS fait ce qu'il faut côté sys.path pour que ça se passe bien...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Invité
    Invité(e)
    Par défaut
    J'ai corrigé mon screenshot ! =)

    Tu t'es planté dans le chemin

    Quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sys.path.append("..")
    from A import a
    Ca cherche le script A.py dans le dossier parent et pas dans le sous-dossier A présent dans le dossier parent !

    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sys.path.append("..")
    from A.A import a

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 677
    Par défaut
    Salut,

    Citation Envoyé par thomas18F Voir le message
    Du coup, je ne comprend vraiment pas qu'est ce qui bloque...
    Déjà, il faut se demander à quoi sont relatifs les imports relatifs.
    Essentiellement au package courant... puisqu'ils ont été crées pour pouvoir restructurer plus facilement des packages.
    Qui dit "package", dit que ça a été importé par le script principal qui définit la "racine" (au dessus de laquelle on ne peut aller).
    => Si j'écris dans un script principal:
    J'obtiens
    "ImportError: attempted relative import with no known parent package".
    Et si la question est "je cherche à savoir comment faire une importation depuis le dossier parent (et si possible le plus simplement possible)", il faut préciser pourquoi on veut faire ça pour savoir si c'est juste une incompréhension des import relatifs ou quelle solution est envisageable.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Par défaut
    Et si la question est "je cherche à savoir comment faire une importation depuis le dossier parent (et si possible le plus simplement possible)", il faut préciser pourquoi on veut faire ça pour savoir si c'est juste une incompréhension des import relatifs ou quelle solution est envisageable.
    C'est probablement en effet juste une incompréhension de ma part sur la manière gérer un projet... Je vais essayer de recommencer tout ça

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thomas18F Voir le message
    C'est probablement en effet juste une incompréhension de ma part sur la manière gérer un projet...
    Ah ben... au départ je pensais à un essai pour voir comment ça fonctionne. Effectivement si c'est pour un vrai projet c'est pas la bonne approche.

    Pour un projet, tu créeras ton programme principal à la racine de ton arborescence. Ainsi étant donné que Python travaillera à partir de ce point, il aura alors directement accès à "A" et à "B" et ce, même si les imports sont demandés ensuite depuis un sous-programme se trouvant lui-même plus bas dans l'arborescence.
    Autrement dit, si j'écris un main.py dans le dossier "dossier_projet" ainsi...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/usr/bin/env python3
    # coding: utf-8
     
    from B import B

    ... je peux alors écrire B/B.py ainsi...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/env python3
    # coding: utf-8
     
    from A import A
    A.fctA()
    ... sans avoir besoin de toucher à sys.path. Etant donné que Python travaillera à partir du dossier "dossier_projet" contenant les sous-dossiers "A" et "B", les imports seront possibles.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Par défaut
    Ah ben... au départ je pensais à un essai pour voir comment ça fonctionne. Effectivement si c'est pour un vrai projet c'est pas la bonne approche.
    Oui il y avait aussi un peu de curiosité au départ, mais en fait je croyais qu'en python, il n'était possible d'importer des fichiers que depuis le répertoire courant.
    Du coup merci beaucoup pour ta réponse, je pense que ça va beaucoup me servir pour la suite

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 677
    Par défaut
    Citation Envoyé par thomas18F Voir le message
    Oui il y avait aussi un peu de curiosité au départ, mais en fait je croyais qu'en python, il n'était possible d'importer des fichiers que depuis le répertoire courant.
    Le "répertoire courant" est celui de l'utilisateur, celui du script principal, est autre chose.

    Si vous avez passé un minimum de temps dans les tutos, vous n'avez pas pu manquer des import de modules tels que time, sys, os, tkinter,...
    Ils ne sont pas dans le répertoire du script principal.

    Avec un peu de chance, vous auriez pu commettre la bévue de créer un module nommé os.py ou time.py. Elle éclaire sur le rôle du path dans le chargement des modules Python (ça importe le premier trouvé...).

    Au lieu de croire, doutez, testez, apprenez une lecture active de la documentation (testez ce que çà dit pour voir si on a (un peu) compris).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2019
    Messages : 34
    Par défaut
    Si vous avez passé un minimum de temps dans les tutos, vous n'avez pas pu manquer des import de modules tels que time, sys, os, tkinter,...
    Ils ne sont pas dans le répertoire du script principal.
    Oui je me suis un peu mal exprimé.
    J'avais bien compris la présence d'une liste de PATH permettant d'importer des modules d'autres répertoires.
    Cependant cette liste de path est "constante" dans la mesure où elle est identique pour tous les projets lancés.
    Du coup le seul "path" qui change d'un projet à l'autre est celui du dossier contenant le script.

    Ce que je n'avais pas compris, c'est que ce path est identique pour le script principal et pour les sous-scripts présents dans des dossiers fils du projet... Je croyais que chaque script définissait son propre "path".

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

Discussions similaires

  1. [XL-2013] Importer depuis un autre dossier une feuille excel
    Par jérémy pro dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/02/2020, 15h10
  2. Réponses: 0
    Dernier message: 17/02/2014, 10h28
  3. Accès dossier parent depuis sous-domaine
    Par borisman dans le forum Apache
    Réponses: 3
    Dernier message: 26/04/2011, 23h03
  4. Problemes d'importation depuis excel
    Par KANCRENAZ dans le forum Access
    Réponses: 3
    Dernier message: 17/02/2005, 09h57
  5. acces à la Bd situee dans le dossier parent
    Par trialrofr dans le forum ASP
    Réponses: 4
    Dernier message: 04/01/2005, 17h37

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