Python kann das Modul nicht im selben Ordner finden

90

Mein Python kann irgendwie keine Module im selben Verzeichnis finden. Was mache ich falsch? (Python2.7)

Ich habe also ein Verzeichnis '2014_07_13_test' mit zwei Dateien:

  1. test.py
  2. hallo.py.

wo hallo.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

und test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Noch gibt mir Python

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

Was ist los mit dir?

Philipp_Kats
quelle
2
Wie führen Sie das Skript aus? Auch was ist die Ausgabe vonimport sys; sys.path
Salem
1
Versuchen Sie>>> import test
Martineau
@Casy_fill Führen Sie Ihr Programm aus dem Verzeichnis aus, in dem sich die Dateien befinden? Für den Import spielt es keine Rolle, dass sich die importierenden und importierten Dateien ein Verzeichnis teilen. Wichtig ist, dass für Ihren Python-Interpreter das aktuelle Verzeichnis richtig eingestellt ist.
Jan Vlcinsky

Antworten:

78

Ihr Code ist in Ordnung. Ich vermute, Ihr Problem besteht darin, wie Sie ihn starten.

Sie müssen Python aus Ihrem Verzeichnis '2014_07_13_test' starten.

Öffnen Sie eine Eingabeaufforderung und "cd" in Ihrem Verzeichnis "2014_07_13_test".

Zum Beispiel:

$ cd /path/to/2014_07_13_test
$ python test.py

Wenn Sie nicht wie folgt in das Verzeichnis 'cd' können, können Sie es zu sys.path hinzufügen

In test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

Oder setzen / bearbeiten Sie den PYTHONPATH

Und alles sollte gut sein ...

... nun, es gibt einen kleinen Fehler mit Ihren 'shebang'-Zeilen (die erste Zeile in Ihren beiden Dateien), es sollte kein Leerzeichen zwischen dem' # 'und dem'! '

Es gibt einen besseren Shebang, den Sie verwenden sollten.

Außerdem benötigen Sie nicht für jede Datei die Shebang-Zeile ... nur diejenigen, die Sie als ausführbare Dateien von Ihrer Shell ausführen möchten.

Jeremy Allen
quelle
Vielen Dank, dass das Problem! Leider unterstützt SublimeRepl (das ich verwende) das Starten von Python aus dem Ordner derzeit nicht. Es scheint also, dass ich PATH jetzt exportieren muss
Philipp_Kats
Spätere Leser lesen bitte bis zum Ende der Seite, um andere sehr nützliche Antworten zu sehen, z. B. die von jfn zu relativen Importen .
HongboZhu
Ja, das war mein Problem. Ich hatte einen großen Ordner mit Python-Übungsprojekten in VS Code geöffnet und hatte große Probleme, Dinge im selben Verzeichnis zu finden. Mein Problem war, dass ich im Terminal keine Verzeichnisse in das Unterverzeichnis geändert hatte, in dem ich mein aktuelles Projekt hatte. Sobald ich das getan hatte, war das Problem gelöst.
Matt West
99

Ändern Sie Ihren Import in test.py in:

from .hello import hello1
jfn
quelle
22
Wenn jemand dies später findet, wird dies als relativer Import bezeichnet und in Python 2.5 hinzugefügt: docs.python.org/2.5/whatsnew/pep-328.html
sgfit
8
Um das gesamte Modul zu importieren, verwenden Siefrom . import hello
ST7
Ich denke, dies ist eine bessere Lösung als die am besten akzeptierte Antwort. Ich verwende den gesamten Modulimport, wie ST7 betonte:from . import local_module
Gene M
22

Ich hatte ein ähnliches Problem und löste es, indem ich das Verzeichnis der Datei explizit zur Pfadliste hinzufügte:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Danach hatte ich kein Problem beim Importieren aus demselben Verzeichnis.

ecotner
quelle
2
Während dies funktionierte, war die Antwort von jwn unter Verwendung relativer Importe eine viel sauberere Lösung.
Russ Schultz
15

Hier ist die generische Lösung, die ich verwende. Es löst das Problem beim Importieren aus Modulen im selben Ordner:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Setzen Sie dies oben auf das Modul, das den Fehler "Kein Modul mit dem Namen xxxx" anzeigt.

Apadana
quelle
1
Dies half mir, das Modul aus dem übergeordneten Verzeichnis zu laden, indem ".." durch "../ .." ersetzt wurde. Vielen Dank!
Nikola R.
ist Dateiname der Datei importiert oder aktuelle Modul werden , wo wir Modul importieren oder es ist konstant
Manoj
9

In meinem Fall konnte Python es nicht finden, weil ich den Code in ein Modul mit Bindestrichen eingefügt hatte, z my-module. Als ich es geändert habe, hat my_modulees funktioniert.

Chris Claxton
quelle
0

Ich bin auf dieses Problem gestoßen. Ich hatte drei Ordner im selben Verzeichnis, also musste ich angeben, welcher Ordner. Beispiel: aus dem Ordnerimport-Skript

Nippon87
quelle