2016-05-28 5 views
0

Ich habe im selben Verzeichnis zwei Module erstellt:Warum einfacher Import von Modul in demselben Verzeichnis ist nicht erlaubt

. 
├── mod1.py 
├── mod2.py 

Es gibt keine __init__.py ist, ich will nicht, dies als ein Paket erstellen, I Ich erstelle nur ein einfaches Skript, das ich modularisiert habe, indem ich in verschiedene Module einbringe.

Meine Absicht ist mod1.py mit python mod1.py

~/junk/imports$ cat mod1.py 
from . import mod2 

print(mod2.some_expr) 


$ cat mod2.py 
some_expr = 'hello world!' 

läuft Obwohl ich weiß, dass import mod1 direkt mit arbeiten, aber ich bin absichtlich nicht in Gebrauch ist, so dass mein Modulname mit in Modulen nicht kollidieren (was ich fühlte mich ist eine gute Praxis)

ich erhalte die folgenden Fehler mit python2 und python3

~/junk/imports$ python3 --version 
Python 3.4.3 
[email protected]:~/junk/imports$ python3 mod1.py 
Traceback (most recent call last): 
    File "mod1.py", line 1, in <module> 
    from . import mod2 
SystemError: Parent module '' not loaded, cannot perform relative import 


~/junk/imports$ python2 --version 
Python 2.7.11 
~/junk/imports$ python2 mod1.py 
Traceback (most recent call last): 
    File "mod1.py", line 1, in <module> 
    from . import mod2 
ValueError: Attempted relative import in non-package 

Die meisten Fragen auf StackOverflow behandeln Pakete, aber ich verwende keine Pakete. Ich möchte es nur als einfaches Skript ausführen.

Meine Frage ist nicht darüber, wie es geht, aber ich möchte wissen, warum der oben genannte nicht funktioniert.

+0

Warum verwenden Sie keine __init__.py-Datei? Wäre das nicht, wenn Python das überprüft? Verzeichnis, es realisiert theres keine init-Datei und wird eine Ausnahme werfen? d. h. Versuch eines relativen Imports in Nicht-Paket – AK47

+0

Ich benutze nicht '__init __. py', weil ich kein Paket erstellen möchte. Ich erstelle nur einfache Skripte. Ich möchte verstehen, warum keine "expliziten" relativen Importe erlaubt sind. –

Antwort

1

Sie sollten nicht im Verhältnis verwenden, sondern absolute Import:

import mod2 
print(mod2.some_expr) 

Die documentation ist ziemlich gut, und diese SO answers gibt eine alternative importlib verwenden.

Wenn ein handgefertigtes Modul mit einem eingebauten Modul kollidiert, ist es wahrscheinlich der richtige Weg, es umzubenennen, eventuell durch Hinzufügen einer {pre, suf} -Fix. Eine andere ist importlib zu verwenden.

Die Motivation, die diesen Einschränkungen zugrunde liegt, kann in der PEP 328 gefunden werden, und kommt hauptsächlich aus BDFL-Einstellungen, gegenüber allen anderen Lösungen.

+0

Ich weiß, ich sollte, aber hier verwende ich expliziten relativen Import. Gibt es einen Grund, warum es nicht empfohlen wird? –

+0

[PEP 328] (https://www.python.org/dev/peps/pep-0328) gibt Informationen über Importe. Soweit ich weiß, werden relative Importe generell nicht empfohlen und sind nur innerhalb von Paketen verfügbar. Von der PEP: * Alle Import-Anweisungen sind standardmäßig absolut (nur bei sys.path) mit spezieller Syntax (führende Punkte) für den Zugriff auf package-relative Importe. * – aluriak

+0

Ich wollte nur 'mod2' importieren. Ich habe die Frage korrigiert! –

Verwandte Themen