2015-07-07 14 views
5

W python 2 mogę utworzyć moduł tak:Jak importować z pliku w bieżącym katalogu w Pythonie 3?

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

I to działa. W pythonie 3 mogę zrobić to samo z interpretera poleceń i działa (edytuj: działało, ponieważ byłem w tym samym katalogu z uruchomionym interpreterem). Jednak jeśli tworzę __ startowy __.py i zrobić to samo tak:

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

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

uzyskać ImportError: Nie można zaimportować nazwy „ClassName” nie widzi „Plik” w ogóle. Zrobi to tak szybko, jak tylko zaimportuję moduł, mimo że mogę zaimportować wszystko, bezpośrednio odwołując się do niego (czego nie chcę robić, ponieważ jest całkowicie niezgodny z resztą naszego kodu). Co daje?

Odpowiedz

6

Spróbuj zaimportować go w ten sposób:

from .file import ClassName 

Zobacz here więcej informacji na temat „decyzji Guido” od importu w python 3 i kompletnego przykład na temat importowania w Pythonie 3.

4

W Pythonie 3 wszystkie import ma wartość bezwzględną, chyba że podano ścieżkę względną, aby wykonać import. Będziesz musiał użyć bezwzględnego lub względnego importu.

Absolute import:

from parent.file import ClassName 

względna import:

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

To działa, pomyślałem, że to jakiś rodzaj wydania ścieżce wyszukiwania. Pisząc to na "liście rzeczy, które zmieniliśmy w pythonie 3 tylko dlatego". Dzięki wielkie. –

+0

To dobra zmiana. Oznacza to, że możesz mieć submoduły, które mają taką samą nazwę jak moduł podstawowy w bibliotece rdzeniowej Pythona, np. 'mymodule.io', a wszystkie importowane pliki' io' są w pełni określone, a python nie importuje arbitralnie niewłaściwego modułu, ponieważ zmieniło się uporządkowanie listy ścieżek do importu. – Dunes

+0

Tak, myślę, że to prawda, dla mnie nazwanie modułu o tej samej nazwie co moduł podstawowy jest za wszelką cenę unikane, chyba że ponownie go wprowadzasz, ale widzę, że bardzo przydatne byłoby uniknięcie "oops zaimportowaliśmy niewłaściwy moduł". –

Powiązane problemy