Résolue

ModuleNotFoundError: No module named 'src'

# Configuration # Résolution d'erreurs

J'ai ce message d'erreur alors que lorsque j'utilise from .views import index cela fonctionne la vue est renvoyée.
J'ai marquer le sossioer 'src' comme source root pour voir mais ça ne donne rien...

Thibault houdon

Mentor

Salut !

Tu peux me faire une capture d'écran de ton pycharm avec la structure de dossiers visibles et le fichier d'URLs ?

Si tu fais un import views et ensuite views.index ça fonctionne ? Comment lances-tu le projet / serveur dans PyCharm ?

voici la capture et non si j'importe views et que je renseigne views.index ça engendre no module named 'views'

Thibault houdon

Mentor

TU peux effectivement faire ton import directement depuis src car c'est le dossier racine, ça devrait marcher.

Sinon tu peux marquer src en tant que Source root, ça va l'ajouter dans ton Pythonpath. Là il me semble selon la capture d'écran que ton dossier src n'est pas marqué ainsi car normalement l'icône est différente pour ces dossiers, ce qui n'est pas le cas ici.

Tu lances ton projet Django depuis le terminal directement ou avec une configuration PyCharm ?

je lance le projet avec la commande ./manage.py runserver mais je viens de configurer runserver depuis edit configurations , rien non plus.
J'ai tenté une modif des python interpreter path également (vu ça dans une de tes formations udemy je crois) et ai ajouté le chemin vers src, rien non plus

Thibault houdon

Mentor

Mais tu lances cette commande dans le terminal ? Si oui, dans quel dossier te trouves-tu quand tu lances la commande ?

Donne moi toutes les infos sur l'environnement, chaque élément peut jouer (quel système d'exploitation, quelle version de Python, est-ce que tu as un environnement virtuel, etc).

je lance depuis le terminal dans pycharm. Je suis dans le dossier src lorsque je lance la commande ./manage.py runserver
Je suis sous mac ventura 13.3, imac sous intel. J'ai python 3.9.1 et django 3.1.6 comme dans la formation et j'ai mis src comme source root

Thibault je pense avoir partiellement trouvé, j'avais mon terminal qui était également ouvert avec le même environnement virtuel activé (leçons précédentes). Je l'ai fermé et hop plus d'erreur si je lance depuis la configuration que j'ai crééé. Si je lance le serveur depuis le terminal de pycharm là src n'est pas reconnu donc cela reste une énigme, ça fonctionne avec from .views mais pas avec src.Docblog.views

Salut !

Désolé j'ai peut être manqué quelque chose mais as tu définit ton dossier comme étant Source root en faisant clic droit dans pycharm il me semble. J'ai vu que Thibault te l'a conseillé mais je ne suis pas sûr si tu as vu ou pas ? J'ai vu ce problème lorsque j'utilisais Pycharm à l'époque (Team Vscode =D ).

bonsoir, merci pour ton aide. oui j'ai defini le dossier src comme Sources root

Bonjour, lorsque je fais from Docblog.viewsok cela fonctionne, ça ne fonctionne pas avec src.Docblog.views, même si je mets le dossier src as Sources root (d'ailleurs la couleur de l'icône ne change pas). Il y a une option mark as test source root où là ça passe en vert mais cela ne donne rien non plus.
Problème de path?

Thibault houdon

Mentor

Salut !

Tout dépend en fait d'où se trouve ton manage.py et de comment tu lances le serveur.

Quand tu lances Django avec ./manage.py runserver, le manage.py configure le Pythonpath pour inclure le répertoire dans lequel manage.py se trouve, ce qui signifie que Django s'attend à ce que tes imports soient relatifs à ce répertoire.

Vu que ton manage.py se trouve dans le répertoire src, Django va ajouter src à ton Pythonpath. Dans ce cas, tu n'auras pas besoin de précéder tes imports avec src. C'est pour ça que le from Docblog.views fonctionne.

Sinon, quand tu utilises from .views import index, le point . fait référence au package actuel dans lequel se trouve le fichier d'où tu fais l'import, ce qui fonctionne si views.py est dans le même dossier que ton fichier d'URLs. Donc ça devrait fonctionner aussi.

Salut Thibault, ok je saisis la nuance. Dans ta vidéo tu es parti sur l'import depuis .views donc dois-je comprendre que si tu avais écrit from src.Docblog.views tu aurais eu le même soucis? Quant à la manière de lancer le serveur faut-il privilégier python manage.py runserver à ./manage.py runserver ?

Thibault houdon

Mentor

Oui, à moins que j'ajoute le dossier parent en Source Root (le dossier qui contient src), pour le mettre dans le pythonpath.

Pour le lancement du serveur, je préfère toujours spécifier python, dans ce cas-là ça va utiliser l'exécutable Python de ton environnement virtuel (si celui-ci est bien activé). C'est toujours mieux d'être explicite, si tu utilises juste ./manage.py runserver, il va utiliser le programme par défaut qui est défini dans ton système d'exploitation pour lancer les fichiers avec l'extension .py, et ce ne sera pas forcément celui que tu veux.

Ok je tente ça en rentrant, merci à toi pour ces explications.

Thibault voici ce que j'obtiens après une nouvelle tentative, en ayant comme import from src.Docblog.views import index:
1 - j'ai créé une configuration runserver dans pycharm. Quand je lance le serveur depuis cette config cela fonctionne

2- si je lance le serveur depuis le terminal de pycharm (environnement virtuel actif bien sûr) avec la commande python manage.py runserver j'ai un message d'erreur no module named src

Thibault houdon

Mentor

Tu te trouves dans quel dossier quand tu lances le serveur avec runserver dans le terminal de PyCharm ?

Ok donc c'est logique, dans PyCharm avec ta configuration, il ajoute toutes les "Content Roots" dans le PYTHONPATH, ça inclue le dossier parent de src (Docblog, le dossier principal de ton projet PyCharm, pas le Docblog de ton projet Django qui contient les views.py, urls.py, etc) ce qui fait que tu peux importer à partir de src.

Quand tu lances dans le terminal, si tu es déjà dans src, il va ajouter le dossier courant dans lequel tu te trouves dans le PYTHONPATH (donc le dossier src). En lançant ainsi ton script, tu peux donc importer à partir des dossiers contenus dans src et non pas à partir de src (donc par exemple import Docblog.views).

Salut Thibault, un grand merci c'est limpide. Je conserve cette info précieusement et opterai à l'avenir pour les chemins relatifs ;-)
Bonne soirée.

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.