2014-09-26 12 views
6

Zastanawiałem się, czy ktoś może rzucić światło na to. Mamy wiele bibliotek pakietów z tym samym pakietem głównym, np. a. Mam też pakiet a.b się w X i pakować a.c zlokalizowany w Y. Obie X i Y są w moim PYTHONPATH i kiedy zrobić:Python importować różne podpakiety z tą samą nazwą pakietu root i różnymi lokalizacjami

import a.c 
import a.b 

pojawia się błąd: "No module named b". Po przeczytaniu dookoła wydaje mi się, że po załadowaniu a.c python zapisuje informacje o a, a kiedy przychodzę zrobić a.b, ponieważ ma informacje o a już nigdy nie zadaje sobie trudu szukania w lokalizacji X dla a.b i zgłasza błąd, że nie moduł o nazwie b można znaleźć.

Co więcej, stwierdziłem, że kolejność, w której X i Y są określone w PYTHONPATH, wydaje się mieć wpływ na import. Na przykład, kiedy robię

PYTHONPATH=$PYTHONPATH:X:Y python 
>>> import a.b # works 
>>> import a.c # fails 

Ale jeśli to zrobię

PYTHONPATH=$PYTHONPATH:Y:X python 
>>> import a.b # fails 
>>> import a.c # works 

Czy to prawda, a jeśli tak, to w jaki sposób można to obejść? Wygodnie jest mieć wspólną nazwę root modułu i różne pakiety podrzędne znajdują się w różnych projektach itp. Oczywiście, pochodzę z punktu widzenia Javy, gdzie można robić takie nakładanie się.

+0

Dzieje się tak zarówno w Pythonie 2 i 3 – Alex

Odpowiedz

6

Znalazłem powiązane pytanie, ale utraciłem link do niego.

Rozwiązaniem jest to:

from pkgutil import extend_path 
__path__ = extend_path(__path__, __name__) 

w korzeniu __init__.py w wszystkie projektów. W tym przypadku w a/__init__.pyBOTH w lokalizacji X i Y. Jeśli masz wiele poziomów podpakietów, musisz je tylko raz uwzględnić.

This pomógł mi i documentation dla extend_path i informacje What is __path__ useful for?

Powiązane problemy