Якщо я перейду CreateUser.py
в основний каталог user_management, я можу легко використовувати: import Modules.LDAPManager
для імпорту LDAPManager.py
--- це працює.
Будь ласка, не роби . Таким чином, LDAPManager
модуль , який використовується CreateUser
буде НЕ бути таким же , як той , імпортованими з допомогою іншого імпорту. Це може створити проблеми, коли у вас є якийсь глобальний стан у модулі або під час травлення / зняття. Уникайте імпорту, який працює лише тому, що модуль потрапляє в один каталог.
Коли у вас є структура пакета, вам слід:
Використання відносного імпорту, тобто якщо CreateUser.py
в Scripts/
:
from ..Modules import LDAPManager
Зверніть увагу , що це було (зверніть увагу на минуле час) збентежений PEP 8 тільки тому , що старі версії пітона не підтримують їх дуже добре, але ця проблема була вирішена років тому. Тока версія PEP 8 робить запропонувати їх в якості прийнятної альтернативи абсолютного імпорту. Вони насправді мені подобаються всередині пакетів.
Використовуйте абсолютний імпорт, використовуючи цілу назву пакета ( CreateUser.py
in Scripts/
):
from user_management.Modules import LDAPManager
Щоб другий працював, пакет user_management
слід встановити всередині PYTHONPATH
. Під час розробки ви можете налаштувати IDE так, щоб це сталося, без необхідності вручну додавати дзвінки в sys.path.append
будь-яке місце.
Також мені здається дивним, що Scripts/
це підпакет. Оскільки при реальній інсталяції user_management
модуль буде встановлений під site-packages
знайденим в lib/
каталозі (будь-який каталог використовується для встановлення бібліотек у вашій ОС), тоді як сценарії повинні бути встановлені під bin/
каталогом (який із виконуваних файлів для вашої ОС).
Насправді я вважаю, що Script/
навіть не повинен бути під user_management
. Це повинно бути на одному рівні user_management
. Таким чином, вам не потрібно використовувати -m
, але вам просто потрібно переконатися, що пакет може бути знайдений (це знову-таки питання налаштування IDE, правильного встановлення пакета або використання PYTHONPATH=. python Scripts/CreateUser.py
для запуску сценаріїв з правильним шляхом).
Підсумовуючи, ієрархія, яку я б використав, така:
user_management (package)
|
|------- __init__.py
|
|------- Modules/
| |
| |----- __init__.py
| |----- LDAPManager.py
| |----- PasswordManager.py
|
Scripts/ (*not* a package)
|
|----- CreateUser.py
|----- FindUser.py
Тоді код CreateUser.py
і FindUser.py
повинен використовувати абсолютний імпорт для імпорту модулів:
from user_management.Modules import LDAPManager
Під час інсталяції ви переконуєтесь, що це user_management
закінчується десь у PYTHONPATH
, а також сценарії всередині каталогу для виконуваних файлів, щоб вони могли знаходити модулі. Під час розробки ви або покладаєтесь на конфігурацію IDE, або запускаєте CreateUser.py
додавання Scripts/
батьківського каталогу до PYTHONPATH
(я маю на увазі каталог, що містить обидва user_management
і Scripts
):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
Або ви можете змінити PYTHONPATH
глобально, щоб вам не потрібно було це кожного разу вказувати. В ОС Unix (Linux, Mac OS X тощо) ви можете змінити один із сценаріїв оболонки, щоб визначити PYTHONPATH
зовнішню змінну, а в Windows потрібно змінити налаштування змінних середовища.
Додаток Я вважаю, якщо ви використовуєте python2, краще переконатися, що уникаєте неявного відносного імпорту, поставивши:
from __future__ import absolute_import
у верхній частині модулів. Цей спосіб import X
завжди означає імпортувати модуль верхнього рівняX
і ніколи не намагатиметься імпортувати X.py
файл, що знаходиться в тому ж каталозі (якщо цього каталогу немає в PYTHONPATH
). Таким чином, єдиним способом зробити відносний імпорт є використання явного синтаксису ( from . import X
), який є кращим ( явний краще, ніж неявний ).
Це гарантує, що ви ніколи не будете використовувати "фальшивий" неявний відносний імпорт, оскільки це призведе до ImportError
явного сигналу про те, що щось не так. Інакше ви могли б використовувати модуль, який не такий, як ви думаєте.
python -m user_management.Scripts.CreateUser