Nếu tôi chuyển CreateUser.py
đến thư mục user_management chính, tôi có thể dễ dàng sử dụng: import Modules.LDAPManager
to import LDAPManager.py
--- điều này hoạt động.
Làm ơn, đừng . Theo cách này, LDAPManager
mô-đun được sử dụng CreateUser
sẽ không giống với mô-đun được nhập qua các lần nhập khác. Điều này có thể tạo ra sự cố khi bạn có một số trạng thái chung trong mô-đun hoặc trong quá trình chọn / giải nén. Tránh nhập chỉ hoạt động vì mô-đun tình cờ nằm trong cùng một thư mục.
Khi bạn có cấu trúc gói, bạn nên:
Sử dụng nhập khẩu tương đối, tức là nếu CreateUser.py
trong Scripts/
:
from ..Modules import LDAPManager
Lưu ý rằng đây là (lưu ý sự qua căng thẳng) nản chí bởi PEP 8 chỉ vì các phiên bản cũ của python không hỗ trợ họ rất tốt, nhưng vấn đề này đã được giải quyết năm trước. Các hiện phiên bản của PEP 8 không đề nghị chúng như một sự thay thế chấp nhận được để nhập khẩu tuyệt đối. Tôi thực sự thích chúng bên trong các gói.
Sử dụng nhập khẩu tuyệt đối bằng cách sử dụng toàn bộ tên gói ( CreateUser.py
trong Scripts/
):
from user_management.Modules import LDAPManager
Để cái thứ hai hoạt động, gói user_management
phải được cài đặt bên trong PYTHONPATH
. Trong quá trình phát triển, bạn có thể định cấu hình IDE để điều này xảy ra mà không cần phải thêm các cuộc gọi đến sys.path.append
bất kỳ đâu theo cách thủ công .
Ngoài ra, tôi thấy thật kỳ lạ khi đó Scripts/
là một gói con. Bởi vì trong cài đặt thực, user_management
mô-đun sẽ được cài đặt trong thư mục site-packages
tìm thấy trong lib/
thư mục (bất kỳ thư mục nào được sử dụng để cài đặt thư viện trong hệ điều hành của bạn), trong khi các tập lệnh phải được cài đặt trong một bin/
thư mục (thư mục nào chứa tệp thực thi cho hệ điều hành của bạn).
Trong thực tế, tôi tin rằng Script/
thậm chí không nên ở dưới user_management
. Nó phải ở cùng mức độ user_management
. Theo cách này, bạn không cần phải sử dụng -m
mà chỉ cần đảm bảo rằng gói có thể được tìm thấy (đây một lần nữa là vấn đề cấu hình IDE, cài đặt gói chính xác hoặc sử dụng PYTHONPATH=. python Scripts/CreateUser.py
để khởi chạy các tập lệnh với đường dẫn chính xác).
Tóm lại, hệ thống phân cấp tôi sẽ sử dụng là:
user_management (package)
|
|------- __init__.py
|
|------- Modules/
| |
| |----- __init__.py
| |----- LDAPManager.py
| |----- PasswordManager.py
|
Scripts/ (*not* a package)
|
|----- CreateUser.py
|----- FindUser.py
Sau đó, mã của CreateUser.py
và FindUser.py
nên sử dụng nhập khẩu tuyệt đối để nhập các mô-đun:
from user_management.Modules import LDAPManager
Trong khi cài đặt, bạn đảm bảo rằng nó user_management
kết thúc ở đâu đó trong PYTHONPATH
và các tập lệnh bên trong thư mục cho các tệp thực thi để chúng có thể tìm thấy các mô-đun. Trong quá trình phát triển, bạn dựa vào cấu hình IDE hoặc bạn khởi chạy CreateUser.py
thêm Scripts/
thư mục mẹ vào PYTHONPATH
(ý tôi là thư mục chứa cả user_management
và Scripts
):
PYTHONPATH=/the/parent/directory python Scripts/CreateUser.py
Hoặc bạn có thể sửa đổi PYTHONPATH
toàn cục để không phải chỉ định điều này mỗi lần. Trên hệ điều hành unix (linux, Mac OS X, v.v.), bạn có thể sửa đổi một trong các tập lệnh shell để xác định PYTHONPATH
biến bên ngoài, trên Windows, bạn phải thay đổi cài đặt biến môi trường.
Phụ lục Tôi tin rằng, nếu bạn đang sử dụng python2, tốt hơn nên đảm bảo tránh nhập tương đối ngầm bằng cách đặt:
from __future__ import absolute_import
ở đầu mô-đun của bạn. Theo cách này, import X
luôn luôn có nghĩa là nhập mô-đun cấp cao nhấtX
và sẽ không bao giờ cố gắng nhập X.py
tệp trong cùng một thư mục (nếu thư mục đó không có trong PYTHONPATH
). Theo cách này, cách duy nhất để thực hiện nhập tương đối là sử dụng cú pháp rõ ràng (the from . import X
), cú pháp này tốt hơn ( rõ ràng tốt hơn là ẩn ).
Điều này sẽ đảm bảo rằng bạn không bao giờ tình cờ sử dụng các phép nhập tương đối ngầm "không có thật", vì chúng sẽ ImportError
báo hiệu rõ ràng rằng có điều gì đó không ổn. Nếu không, bạn có thể sử dụng một mô-đun không giống như bạn nghĩ.
python -m user_management.Scripts.CreateUser