Jeśli CreateUser.pyprzejdę do głównego katalogu user_management, mogę z łatwością użyć: import Modules.LDAPManagerdo importu LDAPManager.py
- to działa.
Proszę, nie rób tego . W ten sposób LDAPManagermoduł wykorzystywany przez CreateUsersię nie być taki sam jak ten importowany za pośrednictwem innych importu. Może to powodować problemy, gdy w module występuje jakiś stan globalny lub podczas wytrawiania / odbierania. Unikaj importu, który działa tylko dlatego, że moduł znajduje się w tym samym katalogu.
Jeśli masz strukturę pakietu, powinieneś:
Użyj importu względnego, tj. Jeśli CreateUser.pyznajduje się w Scripts/:
from ..Modules import LDAPManager
Zauważ, że to było (uwaga przeszłość napięta) zniechęcony przez PEP 8 tylko dlatego, że stare wersje Pythona nie popiera je bardzo dobrze, ale problem ten został rozwiązany rok temu. Aktualna wersja PEP 8 ma sugerować je jako dopuszczalną alternatywą dla importu bezwzględnych. Właściwie to lubię je w paczkach.
Użyj importu bezwzględnego, używając całej nazwy pakietu ( CreateUser.pyin Scripts/):
from user_management.Modules import LDAPManager
Aby drugi zadziałał, pakiet user_managementpowinien być zainstalowany wewnątrz PYTHONPATH. Podczas programowania możesz skonfigurować IDE tak, aby tak się stało, bez konieczności ręcznego dodawania wywołań w sys.path.appenddowolnym miejscu.
Wydaje mi się również dziwne, że Scripts/jest to podpakiet. Ponieważ w prawdziwej instalacji user_managementmoduł zostałby zainstalowany w katalogu site-packagesznalezionym w lib/katalogu (niezależnie od tego, który katalog jest używany do instalowania bibliotek w twoim systemie operacyjnym), podczas gdy skrypty powinny być instalowane w bin/katalogu (którykolwiek zawiera pliki wykonywalne dla twojego systemu operacyjnego).
Właściwie uważam, że Script/nie powinno być nawet poniżej user_management. Powinien być na tym samym poziomie user_management. W ten sposób nie musisz używać -m, ale po prostu musisz upewnić się, że pakiet można znaleźć (to znowu kwestia skonfigurowania IDE, poprawnej instalacji pakietu lub użycia PYTHONPATH=. python Scripts/CreateUser.pydo uruchomienia skryptów z poprawną ścieżką).
Podsumowując, hierarchia I byłoby użyć to:
user_management (package)
|
|------- __init__.py
|
|------- Modules/
| |
| |----- __init__.py
| |----- LDAPManager.py
| |----- PasswordManager.py
|
Scripts/ (*not* a package)
|
|----- CreateUser.py
|----- FindUser.py
Następnie kod CreateUser.pyi FindUser.pypowinien używać importu bezwzględnego do importowania modułów:
from user_management.Modules import LDAPManager
Podczas instalacji upewniasz się, że user_managementkończy się gdzieś w PYTHONPATH, a skrypty w katalogu dla plików wykonywalnych, aby mogły znaleźć moduły. Podczas programowania polegasz na konfiguracji IDE lub uruchamiasz CreateUser.pydodawanie Scripts/katalogu nadrzędnego do PYTHONPATH(mam na myśli katalog, który zawiera oba user_managementi Scripts):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
Lub możesz zmodyfikować PYTHONPATHglobalnie, aby nie trzeba było tego określać za każdym razem. W systemach uniksowych (linux, Mac OS X itp.) Możesz zmodyfikować jeden ze skryptów powłoki, aby zdefiniować PYTHONPATHzmienną zewnętrzną, w systemie Windows musisz zmienić ustawienia zmiennych środowiskowych.
Uzupełnienie Uważam, że jeśli używasz python2, lepiej unikać niejawnego importu względnego, umieszczając:
from __future__ import absolute_import
u góry Twoich modułów. W ten sposób import X zawsze oznacza importować Toplevel modułu Xi nigdy nie będzie próbował zaimportować X.pyplik, który znajduje się w tym samym katalogu (jeśli ten katalog nie jest w PYTHONPATH). W ten sposób jedynym sposobem wykonania importu względnego jest użycie jawnej składni (the from . import X), która jest lepsza ( jawna jest lepsza niż niejawna ).
Dzięki temu nigdy nie użyjesz „fałszywego”, niejawnego importu względnego, ponieważ wywołałoby to ImportErrorwyraźną sygnalizację, że coś jest nie tak. W przeciwnym razie możesz użyć modułu, który nie jest tym, o czym myślisz.
python -m user_management.Scripts.CreateUser