Pytanie Jak zaimportować plik klasy Python z tego samego katalogu?


Mam katalog w moim projekcie Python 3.3 o nazwie / models.

od mojego main.py Po prostu robię

from models import *

w moim __init__.py:

__all__ = ["Engine","EngineModule","Finding","Mapping","Rule","RuleSet"]
from models.engine import Engine,EngineModule
from models.finding import Finding
from models.mapping import Mapping
from models.rule import Rule
from models.ruleset import RuleSet

Działa to świetnie z mojej aplikacji.

Mam model, który zależy od innego modelu, tak, że w moim engine.py Muszę zaimportować finding.py w engine.py. Kiedy robię: from finding import Finding

Dostaję błąd No Such Module exists.

Jak mogę zaimportować klasę B z pliku A w tym samym katalogu / katalogu?

Edytuj 1: Najwyraźniej mogę zrobić: from .finding import Finding i to działa. Poniższa odpowiedź również to odzwierciedla, więc sądzę, że jest to słuszne. Naprawiłem swoje nazewnictwo plików i przeniosłem testy do innego katalogu, a teraz działam płynnie. Dzięki!


23
2018-01-15 13:56


pochodzenie


Z jakiej wersji Pythona korzystasz? - geoffspear
Używam Pythona 3.3 - Yablargo
Python 3 nie dopuszcza ukrytych importów względnych. - geoffspear
@Yablargo Czy umiesz przenieść? Edytuj 1 sekcja i post jako własna odpowiedź (from .finding import Finding)? - kenorb


Odpowiedzi:


Ponieważ używasz Pythona 3, który uniemożliwia ten względny import (może to prowadzić do pomylenia modułów o tej samej nazwie w różnych pakietach).

Użyj albo:

from models import finding

lub

import models.finding

lub prawdopodobnie najlepiej:

from . import finding  # The . means "from the same directory as this module"

33
2018-01-15 14:01



Myślę, że ostatnim powinno być from . import finding (w przeciwnym razie wywoływana jest funkcja SyntaxError - przynajmniej dla mnie na python 3.5). - Dolan Antenucci
Przypuszczam, że od. Wyszukiwanie importu jest lepsze, ponieważ nie koduje nazwy katalogu, podobnie jak każda możliwa klasa nazw z innym modułem jest odwracana w ten sposób - minhajul
w ogóle nie działa - Nicolas S.Xu