skryptu lub moduł importu modułów, albo
- na drodze systemu lub
- część tego samego pakietu, importera skryptu/modułu.
W przypadku modułów obowiązują te zasady bez wyjątku. W przypadku skryptów obowiązują reguły, ale zmarszczka jest taka, że domyślnie po uruchomieniu skryptu nie jest ona uważana za część pakietu.
Oznacza to, że domyślnie skrypt może importować tylko moduły znajdujące się w ścieżce systemowej. Domyślnie ścieżka zawiera katalog bieżący, więc jeśli uruchomisz skrypt, możesz zaimportować moduły do tego samego katalogu lub do pakietów, które są podkatalogami. Ale to jest to. Skrypt nie ma pojęcia "gdzie to jest" w drzewie katalogów, więc nie może wykonywać żadnych importów, które wymagają określonych względnych informacji o ścieżkach dotyczących zamykania katalogów. Oznacza to, że nie można importować rzeczy "z katalogu nadrzędnego" lub "z katalogu rodzeństwa". Rzeczy znajdujące się w tych katalogach można importować tylko wtedy, gdy znajdują się one na ścieżce systemowej.
Jeśli chcesz, aby skrypt "wiedział", że jest w pakiecie, możesz nadać mu atrybut __package__
. Zobacz this previous question. Można wtedy użyć normalnych importów względnych (np. from ...sub2 import mod2
) z poziomu tego skryptu.
Nie mam nic przeciwko edycji PYTHONPATH, ale czy istnieje standardowy sposób na wymuszenie tego? Nie chcę, aby wszyscy nowi użytkownicy repo musieli ręcznie wchodzić i aktualizować swoją PYTHONPATH. – Eli
Jeśli nie chcesz, aby ludzie sami zarządzali 'PYTHONPATH', może być konieczne rozważenie' sys.path' mangling. (Np. Użyj '__file__' oraz' os.abspath', aby sprawdzić, gdzie znajduje się skrypt, a następnie pobierz katalog, którego odpowiednia liczba poziomów jest nadrzędna, a następnie 'sys.path.insert 'it.) – Amber