2017-08-01 6 views
8

Obecnie próbuje pracować w Pythonie3 i używa bezwzględnych importów do importowania jednego modułu do drugiego, ale pojawia się błąd ModuleNotFoundError: No module named '__main__.moduleB'; '__main__' is not a package. Rozważmy taką strukturę projektu:ModuleNotFoundError: Brak modułu o nazwie "__main __. Xxxx"; '__main__' nie jest pakietem

proj 
    __init__.py3 (empty) 
    moduleA.py3 
    moduleB.py3 

moduleA.py3

from .moduleB import ModuleB 
ModuleB.hello() 

moduleB.py3

class ModuleB: 
    def hello(): 
     print("hello world") 

Następnie uruchomiony python3 moduleA.py3 daje błąd. Co należy tutaj zmienić?

Dziękujemy!

+0

Prowadzący "." działa tylko tak, jak chcesz, gdy plik, w którym się znajduje, znajduje się w pakiecie. – anonymoose

+2

@anonymoose to "proj", a nie pakiet? ponieważ ma on __init __. py3? – mpseligson

+1

Nie można użyć wiodącego znaku "." w importach i działa tak, jak chcesz, gdy uruchamiasz plik bezpośrednio w Pythonie. Musisz zaimportować plik. Jeśli umieściłeś inny plik poza 'proj', który miał w sobie' import moduleA', wydaje mi się, że zobaczysz wynik, którego się spodziewasz. – anonymoose

Odpowiedz

2

.moduleB jest importem względnym. Względna działa tylko wtedy, gdy moduł macierzysty jest najpierw importowany lub ładowany. Oznacza to, że musisz zaimportować proj gdzieś w bieżącym środowisku wykonawczym. Kiedy używasz komendy python3 moduleA.py3, nie ma szansy na zaimportowanie modułu nadrzędnego. Można:

  • from proj.moduleB import moduleB LUB
  • Można utworzyć inny skrypt, powiedzmy run.py, aby wywołać from proj import moduleA

Powodzenia w drodze do wspaniałej krainy Pythonie.