TL; DR: nie można zrobić import względne z pliku, który wykonania ponieważ __main__
moduł nie jest częścią pakietu.
Import bezwzględny - zaimportuj coś, co jest dostępne nasys.path
Importy względne - zaimportuj coś odnoszącego się do bieżącego modułu, musi być częścią pakietu
Jeśli uruchamiasz oba warianty dokładnie w ten sam sposób, jeden z nich powinien działać. W każdym razie, oto przykład, który powinien pomóc ci zrozumieć, co się dzieje, dodajmy kolejny main.py
plik z ogólną strukturą katalogów, taką jak ta:
.
./main.py
./ryan/__init__.py
./ryan/config.py
./ryan/test.py
Zaktualizujmy test.py, aby zobaczyć, co się dzieje:
# config.py
debug = True
# test.py
print(__name__)
try:
# Trying to find module in the parent package
from . import config
print(config.debug)
del config
except ImportError:
print('Relative import failed')
try:
# Trying to find module on sys.path
import config
print(config.debug)
except ModuleNotFoundError:
print('Absolute import failed')
# main.py
import ryan.test
Najpierw uruchommy test.py:
$ python ryan/test.py
__main__
Relative import failed
True
Tutaj „test” to plik__main__
moduł i wie nic o przynależności do pakietu nie wiem. import config
Powinno jednak działać, ponieważ ryan
folder zostanie dodany do sys.path.
Zamiast tego uruchommy main.py:
$ python main.py
ryan.test
True
Absolute import failed
A tutaj test znajduje się w pakiecie "ryan" i może wykonywać import względny. import config
kończy się niepowodzeniem, ponieważ niejawne importy względne nie są dozwolone w Pythonie 3.
Mam nadzieję, że to pomogło.
PS: jeśli trzymasz się Pythona 3, __init__.py
pliki nie są już potrzebne .