PyCharm-Fehler: 'Kein Modul' beim Versuch, ein eigenes Modul zu importieren (Python-Skript)

159

Ich habe ein Modul geschrieben (eine Datei my_mod.py, die sich im Ordner befindet my_module). Derzeit arbeite ich in der Datei cool_script.py, die sich im Ordner befindet cur_proj. Ich habe den Ordner in PyCharm mit File - open geöffnet (und ich gehe daher davon aus, dass es sich um ein PyCharm-Projekt handelt).

In ProjectView (CMD-7) kann ich mein Projekt cur_proj(in rot) und unter "Externe Bibliotheken" sehen my_module. In cool_script.py kann ich schreiben

from my_module import my_mod as mm

und PyCharm macht sogar Vorschläge für my_mod. So weit, ist es gut.

Wenn ich jedoch versuche, cool_script.py auszuführen, sagt PyCharm "Kein Modul mit dem Namen my_module".

Das kommt mir komisch vor, weil

A) Im Terminal (OS 10.10.2), in Python, kann ich das Modul problemlos importieren - es gibt einen entsprechenden Eintrag im PYTHONPATH in .bashrc

B) In PyCharm - Einstellungen - Projekt cur_proj - Projektinterpreter - CogWheel neben Python-Interpreter - mehr - Pfade für das ausgewählte Interpreter-Symbol anzeigen, werden die Pfade von PYTHONPATH angezeigt (wie ich denke, dass sie sollten).

Warum wird der Fehler angezeigt, wenn ich versuche, cool_script.py auszuführen? - Was vermisse ich?

Anmerkungen:

Nachtrag 2015-Feb-25

Wenn ich in PyCharm zum Ausführen - Konfigurationen bearbeiten gehe, werden für mein aktuelles Projekt zwei Optionen mit einem Häkchen ausgewählt: " Hinzufügen von Inhaltswurzeln zu PYTHONPATH " und " Hinzufügen von Quellwurzeln zu PYTHONPATH ". Wenn ich beide deaktiviert habe, kann ich mein Modul laden.

So funktioniert es jetzt - aber warum ?

Weitere Fragen stellten sich:

  • Was sind "Inhaltswurzeln" und was sind "Quellwurzeln"? Und warum bricht das Hinzufügen von etwas zum PYTHONPATH irgendwie?
  • sollte ich diese beiden Optionen ständig deaktivieren (also auch in den Standardeinstellungen, nicht nur in den projektspezifischen Konfigurationen (linker Bereich des Dialogfelds Konfigurationen ausführen / debuggen)?
Claus
quelle
2
Möglicherweise haben Sie dies bereits versucht, aber geben Sie beim Importieren von Modulen aus anderen Paketen den Paketnamen an from foldername.mymodule import mymethod. Eine andere Sache, die ich tun musste, ist, den leeren Ordner _init .py in alle Ordner einzufügen , die Sie verwenden würden, um zu Ihrem Modul zu gelangen, falls from parentfolder.childfolder.mymodule ...Sie init in zwei Ordnern benötigen würden. Abhängig davon, wo sich die Ordner relativ zueinander befinden, benötigen Sie möglicherweise ein Paket der obersten Ebene, sys.pathwie in dieser Antwort beschrieben
ziddarth
4
Ich hatte auch dein Problem. Der folgende Beitrag hat meine Probleme gelöst: stackoverflow.com/questions/21236824/…
user3155053
Haben Sie herausgefunden, warum das Deaktivieren dieser Kontrollkästchen tatsächlich funktioniert, anstatt sie zu aktivieren?
Nithish Inpursuit Ofhappiness
Was für mich funktioniert hat, ist das Deaktivieren Enable Django Supportder Einstellungen Languages & Frameworks -> Djangoin der Pro-Version von PyCharm. Es wurde eine Django-Konsole geöffnet, die die Importprobleme verursachte.
Eric Blum

Antworten:

323

Wenn sich Ihr eigenes Modul im selben Pfad befindet, müssen Sie den Pfad als markieren Sources Root. Klicken Sie im Projektexplorer mit der rechten Maustaste auf das Verzeichnis, das Sie importieren möchten. Dann auswählen Mark Directory Asund auswählen Sources Root.

Ich hoffe das hilft.

Beatriz Fonseca
quelle
9
Dies funktionierte für mich, aber ich musste auch die zuvor erstellte Ausführungskonfiguration löschen und neu erstellen, bevor ich den Ordner als Quellstamm markierte.
grinch
2
Und muss hinzugefügt werden __init__.py, damit Python die Verzeichnisse als Pakete enthaltend behandelt: stackoverflow.com/questions/448271/…
Beatriz Fonseca
Wie würden Sie dies tun, wenn Sie keinen Pycharm verwenden würden? Ich habe genau das gleiche Problem.
Boudewijn Aasman
@ BeatrizFonseca Ja, das habe ich getan. Ich konnte es nicht in sublime zum Laufen bringen, aber ich habe pycharm installiert und die Antwort hier ausprobiert und es hat einwandfrei funktioniert, also muss es etwas damit zu tun haben, das richtige Verzeichnis als Root-Paket anzugeben.
Boudewijn Aasman
@BoudewijnAasman Sie könnten versuchen, .vor dem Paketnamen zu verwenden, um anzugeben, dass dieses Paket lokal ist
Beatriz Fonseca
37

Also, wenn du gehst

-> Einstellung -> Projekt: Mein_Projekt -> Projektstruktur,

Nur das Verzeichnis, in dem der Quellcode verfügbar ist, und markieren Sie ihn als "Quellen" (Sie können ihn im selben Fenster sehen). Das Verzeichnis mit dem Quellcode sollte blau werden. Jetzt können Sie in Module importieren, die sich im selben Verzeichnis befinden.

JRD
quelle
3
Mir ist klar, dass dies ein alter Beitrag ist, aber er hat bei mir funktioniert, danke.
Mike - SMT
1
Die gleiche Antwort wurde viele Male getroffen und ignoriert, diesmal versucht und es funktioniert!
A.Ametov
29

PyCharm Community / Professional 2018.2.1

Ich hatte gerade dieses Problem und konnte es auf ähnliche Weise lösen, wie es @Beatriz Fonseca und @Julie betonten.

Wenn Sie zu File-> Settings-> Project: YourProjectName-> gehen Project Structure, haben Sie ein Verzeichnislayout des Projekts, in dem Sie gerade arbeiten. Sie müssen Ihre Verzeichnisse durchsuchen und sie entweder als SourceVerzeichnis für alle Ihre Quelldateien kennzeichnen oder alsResource Ordner für Dateien, die ausschließlich zum Importieren bestimmt sind.

Sie sollten auch sicherstellen, dass Sie __init__.pyDateien in Ihren Ressourcenverzeichnissen oder wirklich überall dort ablegen, aus dem Sie importieren möchten, und es funktioniert einwandfrei.

Ich hoffe, diese Antwort hilft jemandem und hoffentlich wird JetBrains diesen nervigen Fehler beheben.

Oleg Silkin
quelle
2
Dies ist nicht spezifisch für PyCharm Professional , sondern diese Funktion ist auch in der PyCharm Community Edition verfügbar . Klicken Sie in der Projektstruktur mit der rechten Maustaste auf das Verzeichnis, in dem sich das Modul befindet, wählen Sie es Mark Directory asaus dem Kontextmenü aus und wählen Sie Sources Root.
Astitva Srivastava
1
Können Sie uns bitte mitteilen, was diese Quellenwurzel bedeutet? Es hat zwar mein Problem gelöst, aber nicht ganz verstanden, warum ich es tue.
user3341078
8

Ich habe versucht, den Speicherort meiner Dateien zu ermitteln.

z.B E:\git_projects\My_project\__init__.py is my location.

Ich ging zu Datei -> Einstellung -> Projekt: Mein_Projekt -> Projektstruktur und fügte das Inhaltsstammverzeichnis zu einem ungefähren Ort hinzu E:\git_projects\My_project

es hat bei mir funktioniert.

Virendra Patel
quelle
2
Quelle Der Ordner in der Projektstruktur hat für mich funktioniert. Vielen Dank.
Microos
Danke @Virendra Patel und @Microos. Mein Pycharm-Projekt ist in /home/my_user/git_projects/this_git_project/this_pycharm_project/. Ich habe /home/my_user/git_projects/this_git_project/als Inhaltsstamm und /home/my_user/git_projects/this_git_project/this_pycharm_project/als einziger Quellordner hinzugefügt und alles hat endlich geklappt.
KLaz
3

my_moduleIst ein Ordner kein Modul und Sie können keinen Ordner importieren. Versuchen Sie, my_mod.pyin denselben Ordner wie den zu wechseln, cool_script.pyund tun Sie dies dann import my_mod as mm. Dies liegt daran, dass Python nur im aktuellen Verzeichnis und sucht sys.pathund daher nur dann gefunden wird, my_mod.pywenn es sich im selben Verzeichnis befindet

Oder Sie können hier nach einer Antwort suchen , die Ihnen erklärt, wie Sie aus anderen Verzeichnissen importieren können.

Was Ihre anderen Fragen betrifft, weiß ich nicht, da ich PyCharm nicht verwende.

Tom
quelle
Sie können eine init .py in einem Ordner erstellen. Der Python-Interpreter lautet als Python-Paket: mikegrouchy.com/blog/2012/05/be-pythonic-__init__py.html
Beatriz Fonseca
3

Ich habe auch den Fehler "Quellwurzeln zu PYTHONPATH hinzufügen" erhalten. Mein Problem war, dass ich zwei Ordner mit demselben Namen hatte, wie project/subproject1/thing/srcund, project/subproject2/thing/srcund ich hatte beide als Quellstamm markiert. Als ich einen der "thing"Ordner in "thing1"(einen beliebigen eindeutigen Namen) umbenannte, funktionierte es.

Wenn PyCharm automatisch ausgewählte Quellwurzeln hinzufügt, verwendet es möglicherweise nicht den vollständigen Pfad und verwechselt daher Ordner mit demselben Namen.

RubberDuckRabbit
quelle
2

Dies kann verursacht werden, wenn der Python-Interpreter Ihren Code nicht finden kann. Sie müssen Python ausdrücklich erwähnen, um Ihren Code an dieser Stelle zu finden.

Um dies zu tun:

  • Gehen Sie zu Ihrer Python-Konsole
  • In sys.path.extend(['your module location'])Python - Konsole.

In deinem Fall:

  • Gehen Sie zu Ihrer Python-Konsole.
  • Schreiben Sie zu Beginn den folgenden Code:

    import sys
    sys.path.extend([my module URI location])
  • Nachdem Sie diese Anweisung geschrieben haben, können Sie den folgenden Befehl ausführen:

    from mymodule import functions
Shravan Shetty
quelle
Ein bisschen hässlich, den Pfad so hinzuzufügen, aber es hat bei mir funktioniert.
Florian Blume
Dies sollte von pycharm durchgeführt werden. Beim Öffnen einer Konsole sollte er automatisch sys.path.extend-Befehle für die Verzeichnisse einschließlich Abhängigkeiten (andere Projekte) und die Verzeichnisse mit dem Quellcode des vorliegenden Projekts einschließen. ABER ES MACHT ES NICHT automatisch
fabiob
2

Der wichtigste verwirrende Schritt, der ausgeführt werden muss, besteht darin, die Ausführungskonfiguration für die Quelldatei, die Sie ausführen möchten, neu zu erstellen, damit die IDE die neuen Pfade aufnimmt.

Die Art und Weise, wie es für mich tatsächlich funktioniert hat, war, zu Konfigurationen ausführen / bearbeiten ... zu gehen, die Konfiguration für die Datei auszuwählen, die Sie auf der linken Seite ausführen möchten, das Kontrollkästchen "Quellwurzeln zu PYTHONPATH hinzufügen" zu deaktivieren, zu speichern, und dann gehen Sie zurück und aktivieren Sie das Kontrollkästchen und speichern Sie. DANN würde es funktionieren.

Tomchappell
quelle
Erstaunlicherweise war es das, was ich brauchte, obwohl ich es Invalidate Cache/Restartzweimal gemacht hatte!
Josh Friedlander
1

Inhaltswurzeln sind Ordner, die Ihren Projektcode enthalten, während Quellwurzeln ebenfalls als dieselben definiert sind. Der einzige Unterschied, den ich verstanden habe, war, dass der Code in den Quellwurzeln vor dem Code im Inhaltsstamm erstellt wird.

Wenn Sie diese Option deaktivieren, wirkt sich dies nicht auf die Laufzeit aus, bis Sie keine separaten Module in Ihrem Paket erstellen, die manuell mit Django verbunden sind. Das heißt, wenn eine Ihrer Dateien nicht den 'from django import ...' enthält oder eine der Funktionen nicht über django aufgerufen wird, führt das Deaktivieren dieser beiden Optionen zu einer Fehlfunktion.

Update - Das Problem tritt nur bei Verwendung von Virtual Environmanet und nur bei der Steuerung des Projekts über das bereitgestellte Terminal auf. Ursache Das Terminal funktioniert weiterhin über den Standardsystem-Pyhtonpfad und nicht über die virtuelle Umgebung. während das Python Django Control Panel gut funktioniert.

RA123
quelle
1

Die Lösung für dieses Problem, ohne das Verzeichnis als Quellstamm markieren zu müssen, besteht darin, die Ausführungskonfigurationen zu bearbeiten. Wählen Sie in der Ausführung die Option "Eingabe umleiten von" und wählen Sie das Skript aus, das Sie ausführen möchten. Dies funktioniert, weil es dann so behandelt wird, als ob das Skript interaktiv in diesem Verzeichnis ausgeführt wurde. Python markiert den Modulnamen jedoch weiterhin mit dem Fehler "kein Modul mit dem Namen x":

Eingabe umleiten von:

Wenn der Interpreter die import-Anweisung ausführt, sucht er in einer Liste von Verzeichnissen, die aus den folgenden Quellen zusammengestellt wurden, nach x.py:

  1. Das Verzeichnis, aus dem das Eingabeskript ausgeführt wurde, oder das aktuelle Verzeichnis, wenn der Interpreter interaktiv ausgeführt wird
  2. Die Liste der Verzeichnisse, die in der Umgebungsvariablen PYTHONPATH enthalten sind, sofern sie festgelegt ist.
  3. Eine installationsabhängige Liste von Verzeichnissen, die zum Zeitpunkt der Installation von Python konfiguriert wurden, in meinem Fall usr / lib / python3.6 unter Ubuntu.
PyFox
quelle
0

Pycharm 2017.1.1

  1. Klicken Sie auf View->ToolBar&View->Tool Buttons
  2. Im linken Bereich wird angezeigt Project, klicken Sie mit der rechten Maustaste darauf und drücken Sie Autoscroll to source und führen Sie dann Ihren Code aus.

Das hat bei mir funktioniert.

AB Abhi
quelle
0

ln -s. someProject

Wenn Sie someDirectory / someProjectDir und zwei Dateien haben, versuchen file1.py und file2.py sowie file1.py, mit dieser Zeile zu importieren

aus someProjectDir Importdatei2

Es funktioniert nicht, selbst wenn Sie someProjectDir als Quellverzeichnis festgelegt haben und selbst wenn es in den Einstellungen, im Projekt und im Projektstrukturmenü als Inhaltsstamm angezeigt wird. Die einzige Möglichkeit, dies zu tun, besteht darin, das Projekt wie oben gezeigt zu verknüpfen (Unix-Befehl, funktioniert auf dem Mac, nicht sicher, ob er verwendet wird oder welche Syntax für Windows verwendet wird). Es scheint einen Mechanismus zu geben, bei dem Pycharm dies automatisch entweder beim Auschecken aus der Versionskontrolle oder beim Hinzufügen als Kontextstamm ausführt, da der Softlink von Pycharm in einem abhängigen Projekt erstellt wurde. Daher nur das gleiche zu kopieren, obwohl die seltsame Replikation des Verzeichnisses ärgerlich und die Notwendigkeit verwirrend ist. Auch in der Abhängigkeit, in der automatisch erstellt wurde, wird es unter Versionskontrolle nicht als neues Verzeichnis angezeigt. Vielleicht zeigt der Vergleich von .idea-Dateien mehr.

user10895922
quelle
-1

Die Antwort, die für mich funktioniert hat, war in der Tat, was OP in seinem Update 2015 erwähnt: Deaktivieren Sie diese beiden Kontrollkästchen in Ihrer Python-Ausführungskonfiguration:

  • "Fügen Sie PYTHONPATH Inhaltswurzeln hinzu"
  • "Fügen Sie PYTHONPATH Quellwurzeln hinzu"

Ich hatte bereits die Ausführungskonfiguration so eingestellt, dass sie das richtige venv verwendet, sodass PyCharm keine zusätzlichen Arbeiten zum Hinzufügen von Dingen zum Pfad ausführen musste. Stattdessen verursachte es Fehler.

bsberry
quelle