Za całe życie nie mogę uruchomić względnego importu Pythona. Stworzyłem prosty przykład, gdzie to nie działa:
Struktura katalogów jest następująca:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
zawiera tylko: import sub.relative
/sub/relative.py
zawiera tylko from .. import parent
Wszystkie inne pliki są puste.
Podczas wykonywania następujących poleceń w wierszu poleceń:
$ cd /
$ python start.py
Dostaję:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
Używam Pythona 2.6. Dlaczego tak się dzieje? Jak sprawić, by ten przykład piaskownicy działał?
Jeśli masz zamiar dzwonić
relative.py
bezpośrednio, tj. Jeśli naprawdę chcesz importować z modułu najwyższego poziomu, musisz jawnie dodać go dosys.path
listy.Oto jak to powinno działać:
Jeśli uważasz, że powyższe może powodować pewną niespójność, możesz zamiast tego użyć tego:
sys.path[0]
odnosi się do ścieżki, z której został uruchomiony punkt wejścia.źródło
Sprawdzanie w python3:
Przykład 1:
Jeśli uruchomimy to w ten sposób (aby upewnić się, że PYTHONPATH jest pusta):
Wynik:
Jeśli zmienimy import w
sub/relative.py
Jeśli uruchomimy to w ten sposób:
Wynik:
Przykład 2:
Uruchom to jak:
Wynik:
Jeśli zmienimy import w
sub/start.py
:Uruchom to jak:
Wynik:
Uruchom to jak:
Wynik:
Lepiej też skorzystać z importu z katalogu głównego, czyli:
Uruchom to jak:
Wynik:
źródło