Chemin des imports en Python

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

Bonjour,

Mon projet est organisé de la façon suivante :

src
│   main.py
│   __init__.py
│
└───core
    │   __init__.py
    │
    └───classes
            Empty.py
            Node.py
            Vector3D.py
            __init__.py

Pour importer la classe Empty dans mon fichier main.py, je fais from src.core.classes.Empty import Empty. Voici les imports de cette classe Empty :

from src.core.classes.Node import Node
from src.core.classes.Vector3D import Vector3D

Je sais que je pourrais mettre .Node et .Vector3D mais je préfère avoir le chemin entier, je trouve ça plus clair. Bref. Jusqu’ici, pas de problème pour Pycharm, aucune erreur. Je l’exécute dans Pycharm, pas de soucis non plus. Par contre, lorsque je l’exécute dans une console, avec py main.py, j’obtiens l’erreur suivante :

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from src.core.classes.Empty import Empty
ModuleNotFoundError: No module named 'src'

Et ce même si je rentre exactement la commande que fait Pycharm "C:\Program Files (x86)\Python37-32\python.exe" D:/###/###/###/###/###/src/main.py :

Traceback (most recent call last):
  File "D:/louis/Documents/Projects/Python/Newton/src/main.py", line 1, in <module>
    from src.core.classes.Empty import Empty
ModuleNotFoundError: No module named 'src'

Pourquoi est-ce que j’obtiens cette erreur ?
Je n’ai qu’une seule et unique version de Python installée, la 3.7.0.

Merci pour votre aide !

Salut,

Ce qui m’interpelle dans ton organisation, c’est le nom choisi pour le répertoire racine. Vu comme ça ça voudrait dire que ton projet s’appelle src, car une fois installé tu accéderais à ses modules par import src.core.classes.Node.

Je trouve aussi étrange la présence d’un paquet classes, et les noms de module avec des lettres capitales.

Mais revenons sur ton problème : il vient de la gestion du sys.path en Python qui n’est pas toujours claire. En fait, cette liste contient les répertoires dans lesquels seront cherchés les paquets et modules lors des imports. Elle contient par défaut les répertoires d’installation de Python (+ environnement virtuels) et le répertoire contenant le script que tu appelles (ici le répertoire src/).

C’est plutôt le répertoire parent que tu devrais avoir, car c’est lui qui contient un paquet nommé src. Pour faire cela, le plus simple à ton niveau est d’avoir dans ton répertoire src un module __main__ plutôt que main. C’est le nom standard à utiliser.

Pour lancer ton programme, il te suffira de faire (depuis le répertoire parent de src) python -m src. Le path sera correctement réglé et src sera importable. Car c’est src qui sera considéré comme script, et donc le répertoire dans lequel il se trouve qui sera ajouté au path.

Le problème peut aussi se régler avec les entrypoints dans les scripts d’installation setup.py, mais je doute que tu en aies besoin ici.

Oui en effet j’ai juste affiché le contenu du dossier src mais il a bien un dossier parent avec le nom du projet, je ne l’ai juste pas pensé utile pour ma question.

Je trouve aussi étrange la présence d’un paquet classes

Oui il est un peu inutile, c’est nettoyé.

et les noms de module avec des lettres capitales

C’est une convention que je suis, quand un fichier python défini uniquement une classe, alors le fichier porte le nom de cette classe en commençant par une majuscule. Je sais que ce ne sont les conventions de Python, mais je trouve que c’est beaucoup plus clair comme ça.

Pour faire cela, le plus simple à ton niveau est d’avoir dans ton répertoire src un module __main__ plutôt que main. C’est le nom standard à utiliser.

En effet, tout fonctionne désormais ! Merci pour ton aide !

Oui je me doutais bien qu’il y avait un répertoire parent (c’est dans celui-ci qu’on placerait le README et autres fichiers informels), mais j’indiquais que le nom de src pour les sources n’est pas très judicieux.

Quelques exemple sde gros projets Python, aucun dossier src mais un dossier avec le nom du projet : django, requests ou numpy. Ils pourraient bien sûr avoir un dossier src mais l’installation serait alors plus compliquée car il ne faudrait pas que tous les paquets installés s’appellent src.

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