2015-07-07 10 views
5

In Python 2 Ich kann ein Modul wie folgt erstellen:Wie importiere ich aus einer Datei im aktuellen Verzeichnis in Python 3?

parent 
->module 
    ->__init__.py (init calls 'from file import ClassName') 
    file.py 
    ->class ClassName(obj) 

Und das funktioniert. In Python 3 kann ich dasselbe vom Kommandointerpreter aus tun und es funktioniert (edit: Das funktionierte, weil ich im selben Verzeichnis war, in dem der Interpreter lief). Allerdings, wenn ich __ init __.py und tun das Gleiche wie das schaffen:

"""__init__.py""" 
from file import ClassName 

"""file.py""" 
class ClassName(object): ...etc etc 

I Import erhalten: kann nicht importieren Namen ‚Classname‘, es nicht sehen ‚Datei‘ überhaupt. Es wird dies tun, sobald ich das Modul importiere, obwohl ich alles importieren kann, indem ich es direkt referenziere (was ich nicht tun möchte, da es völlig inkonsistent mit dem Rest unserer Codebasis ist). Was gibt?

Antwort

6

Versuchen Import es so aus:

from .file import ClassName 

here weitere Informationen "Entscheidung Guido" auf See auf die Einfuhren in Python 3 und vollständiges Beispiel, wie in Python 3 3.

4

in Python importieren alle Importe sind absolut, es sei denn, es wird ein relativer Pfad angegeben, aus dem der Import ausgeführt werden soll. Sie müssen entweder einen absoluten oder relativen Import verwenden.

Absoluter Import:

from parent.file import ClassName 

Relative Import:

from . file import ClassName 
# look for the module file in same directory as the current module 
+0

das funktioniert, dachte es eine Art Suchpfad Problem. Das ist die Sache, die wir in Python 3 nur deshalb geändert haben. Vielen Dank. –

+0

Das ist eine gute Veränderung. Es bedeutet, dass Sie Submodule haben können, die denselben Namen wie ein Basismodul in der Python-Core-Bibliothek haben, z. 'mymodule.io', und alle Importe für' io' sind vollständig spezifiziert, und Python importiert nicht willkürlich das falsche Modul, da sich die Reihenfolge der Liste der zu importierenden Pfade geändert hat. – Dunes

+0

Ja, ich denke, das ist wahr, ein Modul mit dem gleichen Namen wie ein Basismodul zu benennen, ist um jeden Preis zu vermeiden, es sei denn, du implementierst es neu, aber ich kann sehen, wie "oops wir das falsche Modul importiert" vermeiden. –

Verwandte Themen