Jeśli CreateUser.py
przejdę do głównego katalogu user_management, mogę z łatwością użyć: import Modules.LDAPManager
do importu LDAPManager.py
- to działa.
Proszę, nie rób tego . W ten sposób LDAPManager
moduł wykorzystywany przez CreateUser
się 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.py
znajduje 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.py
in Scripts/
):
from user_management.Modules import LDAPManager
Aby drugi zadziałał, pakiet user_management
powinien 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.append
dowolnym miejscu.
Wydaje mi się również dziwne, że Scripts/
jest to podpakiet. Ponieważ w prawdziwej instalacji user_management
moduł zostałby zainstalowany w katalogu site-packages
znalezionym 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.py
do 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.py
i FindUser.py
powinien używać importu bezwzględnego do importowania modułów:
from user_management.Modules import LDAPManager
Podczas instalacji upewniasz się, że user_management
koń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.py
dodawanie Scripts/
katalogu nadrzędnego do PYTHONPATH
(mam na myśli katalog, który zawiera oba user_management
i Scripts
):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
Lub możesz zmodyfikować PYTHONPATH
globalnie, 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ć PYTHONPATH
zmienną 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 X
i nigdy nie będzie próbował zaimportować X.py
plik, 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 ImportError
wyraź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