Erreur PyCharm: 'No Module' lors de la tentative d'importation de son propre module (script python)

161

J'ai écrit un module (un fichier de my_mod.pyfichier résidant dans le dossier my_module). Actuellement, je travaille dans le fichier cool_script.pyqui réside dans le dossier cur_proj. J'ai ouvert le dossier dans PyCharm en utilisant File - open (et je suppose qu'il s'agit donc d'un projet PyCharm).

Dans ProjectView (CMD-7), je peux voir mon projet cur_proj(en rouge) et sous "Bibliothèques externes" je vois my_module. Dans cool_script.py, je peux écrire

from my_module import my_mod as mm

et PyCharm fait même des suggestions pour my_mod. Jusqu'ici tout va bien.

Cependant, lorsque j'essaye d'exécuter cool_script.py, PyCharm me dit "Aucun module nommé my_module"

Cela me semble étrange, car

A) dans le terminal (OS 10.10.2), en python, je peux importer le module sans problème - il y a une entrée correspondante dans le PYTHONPATH en .bashrc

B) dans PyCharm - Paramètres - Projet cur_proj - Interpréteur de projet - CogWheel à côté de l'interpréteur python - plus - afficher les chemins pour l'icône de l'interpréteur sélectionné, les chemins de PYTHONPATH apparaissent (comme je pense qu'ils devraient)

Par conséquent, pourquoi j'obtiens l'erreur lorsque j'essaye d'exécuter cool_script.py? - Qu'est-ce que je manque?

Remarques:

Addendum 2015-févr.-25

Quand je vais dans PyCharm pour exécuter - Modifier les configurations, pour mon projet actuel, il y a deux options qui sont sélectionnées avec une coche: " Ajouter des racines de contenu à PYTHONPATH " et " Ajouter des racines de source à PYTHONPATH ". Lorsque les deux sont décochés, je peux charger mon module.

Cela fonctionne donc maintenant - mais pourquoi ?

D'autres questions ont émergé:

  • Que sont les «racines de contenu» et que sont les «racines de source»? Et pourquoi l'ajout de quelque chose au PYTHONPATH le fait-il en quelque sorte casser?
  • Dois-je décocher ces deux options tout le temps (donc aussi dans les valeurs par défaut, pas seulement les configurations spécifiques au projet (panneau de gauche de la boîte de dialogue Exécuter / Déboguer les configurations)?
Claus
la source
2
Vous avez peut-être déjà essayé cela, mais lors de l'importation de modules à partir d'autres packages, incluez le nom du paquet from foldername.mymodule import mymethod. Une autre chose que j'ai dû faire est d'ajouter le dossier vide _init .py dans tous les dossiers que vous utiliseriez pour accéder à votre module, donc dans le cas où from parentfolder.childfolder.mymodule ...vous auriez besoin de init dans deux dossiers. En fonction de l'emplacement des dossiers les uns par rapport aux autres, vous devrez peut-être disposer d'un package de niveau supérieur sys.pathcomme décrit dans cette réponse
ziddarth
4
J'ai eu ton problème aussi. Le message suivant a résolu mes problèmes: stackoverflow.com/questions/21236824/…
user3155053
Avez-vous identifié pourquoi décocher ces cases à cocher fonctionne réellement plutôt que de les cocher?
Nithish Inpursuit Ofhappiness
Ce qui a fonctionné pour moi, c'est de décocher Enable Django Supportles paramètres Languages & Frameworks -> Djangode la version Pro de PyCharm. Il ouvrait une console django qui causait les problèmes d'importation.
Eric Blum

Réponses:

324

Si votre propre module est dans le même chemin, vous devez marquer le chemin comme Sources Root. Dans l'explorateur de projet, cliquez avec le bouton droit sur le répertoire que vous souhaitez importer. Puis sélectionnez Mark Directory Aset sélectionnez Sources Root.

J'espère que ça aide.

Beatriz Fonseca
la source
9
Cela a fonctionné pour moi, mais j'ai également dû supprimer et recréer la configuration d'exécution que j'avais précédemment créée avant de marquer le dossier comme racine des sources.
grinch
2
Et il faut ajouter __init__.pypour que Python traite les répertoires comme contenant des packages: stackoverflow.com/questions/448271/...
Beatriz Fonseca
Comment feriez-vous cela si vous n'utilisiez pas pycharm? Je rencontre exactement le même problème.
Boudewijn Aasman
@BeatrizFonseca Oui, je l'ai fait. Je ne pouvais pas le faire fonctionner en sublime, mais j'ai installé pycharm et essayé la réponse ici et cela a parfaitement fonctionné, donc cela doit avoir quelque chose à voir avec la spécification du bon répertoire comme package racine.
Boudewijn Aasman
@BoudewijnAasman, vous pouvez essayer d'utiliser .avant le nom du paquet pour spécifier que ce paquet est local
Beatriz Fonseca
38

Donc si vous allez à

-> Paramétrage -> Projet: Mon_projet -> Structure du projet,

Juste le répertoire dans lequel le code source est disponible et marquez-le comme "Sources" (vous pouvez le voir dans la même fenêtre). Le répertoire avec le code source doit devenir bleu. Maintenant, vous pouvez importer des modules résidant dans le même répertoire.

JRD
la source
3
Je me rends compte que c'est un vieux post mais ça a marché pour moi merci
Mike - SMT
1
Rencontré et ignoré la même réponse plusieurs fois, cette fois essayé et ça marche!
A.Ametov
29

Communauté PyCharm / Professionnel 2018.2.1

J'avais ce problème tout à l'heure et j'ai pu le résoudre de la même manière que @Beatriz Fonseca et @Julie l'ont souligné.

Si vous allez à File-> Settings-> Project: YourProjectName-> Project Structure, vous aurez une disposition de répertoire du projet dans lequel vous travaillez actuellement. Vous devrez parcourir vos répertoires et les étiqueter comme étant le Sourcerépertoire de tous vos fichiers source , ou en tant que Resourcedossier pour les fichiers strictement destinés à l'importation.

Vous voudrez également vous assurer que vous placez les __init__.pyfichiers dans vos répertoires de ressources, ou vraiment partout où vous souhaitez importer, et cela fonctionnera parfaitement.

J'espère que cette réponse aidera quelqu'un, et j'espère que JetBrains corrigera ce bogue ennuyeux.

Oleg Silkin
la source
2
Ceci n'est pas spécifique à PyCharm Professional , mais cette fonctionnalité est également disponible dans l' édition PyCharm Community . Dans la structure du projet, cliquez avec le bouton droit sur le répertoire contenant le module puis sélectionnez Mark Directory asdans le menu contextuel et sélectionnez Sources Root.
Astitva Srivastava
1
Pouvez-vous s'il vous plaît indiquer ce que signifie cette racine des sources. Bien que cela ait résolu mon problème, mais je n'ai pas tout à fait compris pourquoi je le fais.
user3341078
8

Ce que j'ai essayé, c'est de trouver l'emplacement où se trouvent mes fichiers.

par exemple E:\git_projects\My_project\__init__.py is my location.

Je suis allé dans File -> Setting -> Project: My_project -> Project Structure et j'ai ajouté la racine du contenu à environ mentionner le lieu E:\git_projects\My_project

cela a fonctionné pour moi.

Virendra Patel
la source
2
Source le dossier dans la structure du projet a fonctionné pour moi. THX.
Microos
Merci @Virendra Patel et @Microos. Mon projet pycharm est en cours /home/my_user/git_projects/this_git_project/this_pycharm_project/. J'ai ajouté en /home/my_user/git_projects/this_git_project/tant que racine de contenu et en /home/my_user/git_projects/this_git_project/this_pycharm_project/tant que seul dossier source et tout a finalement fonctionné.
KLaz
3

my_moduleest un dossier pas un module et vous ne pouvez pas importer un dossier, essayez de vous déplacer my_mod.pyvers le même dossier que le cool_script.py, puis faites import my_mod as mm. C'est parce que python ne regarde que dans le répertoire courant et sys.path, et ne le trouvera donc pas à my_mod.pymoins qu'il ne soit dans le même répertoire

Ou vous pouvez chercher ici une réponse vous indiquant comment importer à partir d'autres répertoires.

Quant à vos autres questions, je ne sais pas car je n'utilise pas PyCharm.

À M
la source
Vous pouvez créer un init .py dans un dossier, l'interpréteur python se lira comme un package python: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca
3

J'obtenais également l'erreur "Ajouter des racines source à PYTHONPATH". Mon problème était que j'avais deux dossiers avec le même nom, comme project/subproject1/thing/srcet project/subproject2/thing/srcet que je les avais tous les deux marqués comme racine source. Lorsque j'ai renommé l'un des "thing"dossiers en "thing1"(n'importe quel nom unique), cela a fonctionné.

Peut-être que si PyCharm ajoute automatiquement les racines sources sélectionnées, il n'utilise pas le chemin complet et mélange donc les dossiers du même nom.

CaoutchoucCanardLapin
la source
2

Cela peut se produire lorsque l'interpréteur Python ne trouve pas votre code. Vous devez mentionner explicitement à Python pour trouver votre code à cet emplacement.

Faire cela:

  • Accédez à votre console python
  • Ajouter sys.path.extend(['your module location'])à la console Python.

Dans ton cas:

  • Accédez à votre console python,
  • Au début, écrivez le code suivant:

    import sys
    sys.path.extend([my module URI location])
  • Une fois que vous avez écrit cette déclaration, vous pouvez exécuter la commande suivante:

    from mymodule import functions
Shravan Shetty
la source
Un peu moche d'ajouter le chemin comme ça mais ça a marché pour moi.
Florian Blume
ceci doit être fait par pycharm, automatiquement lors de l'ouverture d'une console, il doit inclure les commandes sys.path.extend pour les répertoires comprenant les dépendances (autres projets) et les répertoires contenant le code source du présent projet. MAIS IL NE LE FAIT PAS automatiquement
fabiob
2

La principale étape déroutante qui doit être effectuée est de recréer la configuration d'exécution pour le fichier source que vous essayez d'exécuter, afin que l'EDI récupère les nouveaux chemins.

La façon dont cela a fonctionné pour moi était d'aller dans Exécuter / Modifier les configurations ..., sélectionnez la configuration du fichier que vous essayez d'exécuter sur le côté gauche, décochez la case "Ajouter les racines source à PYTHONPATH", enregistrez, puis revenez en arrière et cochez la case et enregistrez. ALORS cela fonctionnerait.

Tomchappell
la source
Étonnamment, c'était ce dont j'avais besoin, même si j'avais fait Invalidate Cache/Restartdeux fois!
Josh Friedlander
1

Les racines de contenu sont des dossiers contenant le code de votre projet, tandis que les racines source sont également définies de la même manière. La seule différence que j'ai pu comprendre était que le code des racines source est construit avant le code de la racine du contenu.

Les décocher n'affecterait pas le runtime tant que vous ne créerez pas de modules séparés dans votre package qui sont connectés manuellement à Django. Cela signifie que si l'un de vos fichiers ne contient pas le 'from django import ...' ou que l'une des fonctions n'est pas appelée via django, décocher ces 2 options entraînera un dysfonctionnement.

Mise à jour - le problème survient uniquement lors de l'utilisation de Virtual Environmanet, et uniquement lors du contrôle du projet via le terminal fourni. Parce que le terminal fonctionne toujours via le pyhtonpath système par défaut et non via l'environnement virtuel. tandis que le panneau de contrôle de python django fonctionne très bien.

RA123
la source
1

La solution à ce problème sans avoir à marquer le répertoire comme racine source est de modifier les configurations d'exécution et dans Exécution, sélectionnez l'option "Rediriger l'entrée depuis" et choisissez le script que vous souhaitez exécuter. Cela fonctionne car il est ensuite traité comme si le script était exécuté de manière interactive dans ce répertoire. Cependant, Python marquera toujours le nom du module avec une erreur "aucun module nommé x":

Rediriger l'entrée de:

Lorsque l'interpréteur exécute l'instruction d'importation, il recherche x.py dans une liste de répertoires assemblés à partir des sources suivantes:

  1. Le répertoire à partir duquel le script d'entrée a été exécuté ou le répertoire actuel si l'interpréteur est exécuté de manière interactive
  2. La liste des répertoires contenus dans la variable d'environnement PYTHONPATH, si elle est définie.
  3. Une liste dépendante de l'installation des répertoires configurés au moment de l'installation de Python, dans mon cas usr / lib / python3.6 sur Ubuntu.
PyFox
la source
0

Pycharm 2017.1.1

  1. Cliquez sur View->ToolBar&View->Tool Buttons
  2. Dans le volet gauche Projectserait visible, cliquez dessus avec le bouton droit de la souris et appuyez sur Autoscroll to source , puis exécutez votre code.

Cela a fonctionné pour moi.

AB Abhi
la source
0

ln -s. un projet

Si vous avez someDirectory / someProjectDir et deux fichiers, file1.py et file2.py, et file1.py essaie d'importer avec cette ligne

à partir du fichier d'importation someProjectDir2

Cela ne fonctionnera pas, même si vous avez désigné someProjectDir comme répertoire source, et même s'il apparaît dans les préférences, le projet, le menu de structure du projet en tant que racine de contenu. La seule façon dont cela fonctionnera est de lier le projet comme indiqué ci-dessus (commande unix, fonctionne sous mac, pas sûr de l'utilisation ou de la syntaxe pour Windows). Il semble qu'il y ait un mécanisme dans lequel Pycharm le fait automatiquement soit lors de l'extraction du contrôle de version, soit en ajoutant en tant que racine de contexte, puisque le lien logiciel a été créé par Pycharm dans un projet dépendant. Par conséquent, copier simplement le même, bien que la réplication étrange du répertoire soit ennuyeuse et que la nécessité soit déroutante. Également dans la dépendance où automatiquement créé, il ne s'affiche pas en tant que nouveau répertoire sous le contrôle de version. Peut-être que la comparaison des fichiers .idea en révélera plus.

user10895922
la source
-1

La réponse qui a fonctionné pour moi était en effet ce que OP mentionne dans sa mise à jour de 2015: décochez ces deux cases dans votre configuration d'exécution Python:

  • "Ajouter des racines de contenu à PYTHONPATH"
  • "Ajouter des racines sources à PYTHONPATH"

J'avais déjà configuré la configuration d'exécution pour utiliser le venv approprié, donc PyCharm effectuant un travail supplémentaire pour ajouter des éléments au chemin n'était pas nécessaire. Au lieu de cela, cela causait des erreurs.

baies
la source