2014-12-08 11 views
10

Ich versuche ein Modul (venues) aus einer IPython-Shell zu importieren. Das Modul venues wird korrekt importiert, versucht sich dann jedoch selbst, ein Modul mit dem Namen makesoup zu importieren, und führt dies nicht aus.Python 3: Modul im selben Verzeichnis wie das Skript: "ImportError: Kein Modul namens"

Ich bin im Verzeichnis ~ und versuche, die venues.py Datei im Unterverzeichnis processors zu importieren. Die Datei makesoup.py befindet sich auch im Unterverzeichnis processors, was bedeutet, dass jedes Python-Skript in der Nähe es finden könnte, richtig?

In [1]: import processors.venues 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
<ipython-input-1-765135ed9288> in <module>() 
----> 1 import processors.venues 

~/processors/venues.py in <module>() 
     7 """ 
     8 
----> 9 import makesoup 
    10 import re 
    11 

ImportError: No module named 'makesoup' 

Ich habe eine leere __init__.py in beide die ~ und processors Verzeichnisse, ohne Erfolg hinzugefügt.

Hinweis: Das makesoup Modul ist korrekt importiert, wenn ich in processors bin, aber ich weiß, dass dies nicht die einzige Möglichkeit ist, die es funktionieren sollte.

Antwort

17

The makesoup.py file is also located in the processors subdirectory, which means any Python script near it should be able to find it, right?

Nein. Diese Funktion was changed in Python 3 und diese Syntax funktioniert nicht mehr.

Ändern Sie den import makesoup dazu:

from . import makesoup 

Oder dies:

from processors import makesoup 

Beides wird es unmöglich machen python processors/venues.py direkt zu laufen, obwohl Sie noch python -m processors.venues von Ihrem Home-Verzeichnis tun können .

+0

Danke Kevin. Ich verstehe jedoch nicht, warum diese Lösungen es unmöglich machen, 'locations.py' direkt zu betreiben. Kannst du mir sagen warum? –

+0

Wenn Sie einen expliziten relativen Import verwenden (die erste Option, die ich aufgelistet habe), muss die magische Variable "__package__" gesetzt sein, aber 'python' wird dies nicht tun, wenn Sie ein Skript direkt ohne '-m' ausführen. Wenn Sie einen absoluten Import verwenden, wird Python wahrscheinlich das 'processors' -Paket nicht finden können, da es sich nicht im selben Verzeichnis wie das Skript befindet. Auch hier wird "-m" das beheben. – Kevin