B importe C, A importe B, mais A ne reconnais pas en C en tant que module.

Énigmatique ? Ce casse-tête me tracasse depuis peu mais ça ne m'a pas empêché d'en arriver au dernier recours.

Le problème exposé dans ce sujet a été résolu.

Bonsoir ^^ ,

Je développe un projet depuis ce matin qui consisterai en un outils annexes à grep, c’est à dire qu’il permettrait de trouver un nom de fichier dans tous les répertoires de votre ordinateur à l’exception de ceux indiqué dans un fichier à la racine nommé .ignore.

Vous vous baserez sur le repository du projet pour la suite des explications.

Comme dit dans l’énoncé de ce post, le fichier run.py (A) importe le fichier search.py (B) qui se trouve dans le répertoire src/. Ce dernier (B) importe à son tour le fichier ignore_analyse.py ( C ). Ma logique voulait que étant donné que (A) importe (B), et que (B) importe ( C ), (A) pouvait avoir accés à ( C ). Le message d’erreur obtenu est le suivant, lorsque j’exécute run.py :

Erreur provenant du fichier run.py

File "C:\Users\b4b4a\Documents\programs\projects\rmaoc\run.py", line 2, in <module> import src.search as search File "C:\Users\b4b4a\Documents\programs\projects\rmaoc\src\search.py", line 2, in <module> import ignore_analyser as ignore`

Cordialement, b4b4.

+0 -0

Salut,

Dans le message d’erreur que tu nous donnes il manque justement… le message d’erreur.

Je pense qu’il s’agit d’un problème de module introuvable en raison de l’arborescence de tes fichiers : en effet depuis le répertoire parent Python ne connaît pas les noms des modules du répertoire src.

Le mieux serait alors de passer par un package afin que Python puisse retrouver correctement le chemin de tous tes modules.

from . import mon_module est une partie de la solution. Tout est dans l’organisation de tes modules. Si tu tiens, à placer ton code dans le répertoire src, ce n’est n’est pas une pratique encouragée en python, tu peux structurer le programme comme suit:

.
├── README.md
└── src
    ├── myprogram
    │   ├── __init__.py
    │   ├── ignore_analysis.py
    │   └── search.py
    └── run.py

En utilisant les imports relatifs au seins de modules de myprogram. Le programme peut alors être démarré en exécutant $ python chemin/vers/run.py.

Une approche plus standard serait de déplacer run.py dans myprogram et de le renommer selon les recommandations __main__.py. Le programme peut être démarré simplement avec la commande python -m myprogram et ton répertoire src doit être le répertoire courant ou être n’importe où dans le PYTHONPATH.

Pour une structure sans le répertoire src, il suffit de déplacer son contenu à la racine du projet, ce qui est l’approche la plus courante.

Salut,

Si tu tiens, à placer ton code dans le répertoire src, ce n’est n’est pas une pratique encouragée en python

Je sais pas d’où tu sors ça, mais le src-layout fait partie des pratiques standards. C’est même dans certains cas à préférer au flat-layout que tu proposes parce que la découverte de packages par les outils de packaging et de distribution est plus robuste avec un src-layout.

et ton répertoire src doit être le répertoire courant ou être n’importe où dans le PYTHONPATH.

Par contre, trafiquer PYTHONPATH juste pour avoir accès un package est clairement une mauvaise pratique. PYTHONPATH est une escape hatch pour se plugger temporairement à la main sur une installation non-standard de Python plutôt que de rendre accessible un package/script. PYTHONPATH va notamment être propagé aux environnements virtuels, donc s’en servir pour quoique ce soit d’autre que ce cas bien particulier (i.e. quasiment jamais) devient vite ingérable. La façon propre de rendre accessible un script est d’en faire un package et l’installer avec pip (ou équivalent, mais pip est le standard de facto).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte