Trong Python, một mô -đun là một đơn vị mã Python có thể được nhập [tải và sử dụng] bằng mã Python khác. Một mô -đun có thể chứa các định nghĩa [như các hàm và hằng số], cũng như các câu lệnh khởi tạo các định nghĩa đó. Khi mã mô -đun được viết, nó có thể được sử dụng lại bởi bất kỳ tập lệnh nào nhập mô -đun.module is a single unit of Python code that can be imported [loaded and used] by other Python code. A module can contain definitions [like functions and constants], as well as statements that initialize those definitions. Once the module code is written, it can be reused by any script that imports the module.
Một cách phổ biến để tạo mô -đun Python là tạo một tệp với tên tệp kết thúc bằng .py
và viết mã mô -đun vào đó. Nếu chúng ta sử dụng một phần mở rộng tệp khác trong tên tệp hoặc không có tiện ích mở rộng nào, các câu lệnh import
tiêu chuẩn được hiển thị bên dưới sẽ không hoạt động và chúng ta sẽ phải sử dụng importlib
thay thế, đòi hỏi nhiều mã hơn [thêm thông tin bên dưới].
Để minh họa việc sử dụng tiêu chuẩn import
, giả sử chúng tôi tạo một tệp có tên mymodule.py
với định nghĩa chức năng sau:
Bây giờ mỗi khi chúng ta muốn viết "Xin chào, thế giới!" Đối với màn hình từ tập lệnh Python, chúng ta chỉ có thể nhập mô -đun này thay vì phải viết lại tin nhắn. Nó cũng cho phép chúng tôi thay đổi một dòng mã bên trong mymodule.py
thay vì trong nhiều tập lệnh khác nhau nếu chúng tôi quyết định thay đổi thông báo mà chúng tôi muốn hiển thị trong tất cả các tập lệnh sử dụng chức năng này.
mymodule.py
chứa hàm say_hello[]
mà chúng ta đã thấy ở trên.
Tên được sử dụng trong câu lệnh import
chỉ đơn giản là tên tệp của mô -đun mà không có phần mở rộng .py
ở cuối.
Phiên bản Python 3.3 và cao hơn cho phép nhập các mô -đun dễ dàng trong các thư mục con của thư mục của tập lệnh hiện tại. Nếu bạn đang sử dụng phiên bản Python thấp hơn 3.3, bạn có thể làm theo các bước trong nhập tệp trong một thư mục khác.
Trong một đường dẫn hệ thống tệp, chúng tôi sẽ tách các thành phần của đường dẫn bằng cách sử dụng
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]2 [Linux, MacOS, v.v.] hoặc
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]3 [Windows]. Tuy nhiên, trong một câu lệnh Python
import
, chúng tôi phân tách các thành phần đường dẫn bằng DOT [import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]5].
trong đó
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]6 là bất kỳ tên nào chúng tôi chọn. Chúng tôi cũng có thể nhập chức năng trực tiếp:
Điều này hoạt động ngay cả khi có nhiều cấp độ của thư mục con. Ví dụ: nếu chúng ta có cấu trúc thư mục sau:
Bây giờ chúng ta hãy nói rằng chúng ta chuyển mymodule.py
sang một thư mục bên ngoài cây thư mục hiện tại:
Theo mặc định, Python tìm các tệp trong cùng một thư mục [bao gồm cả thư mục con] là tệp tập lệnh hiện tại, cũng như ở các vị trí tiêu chuẩn khác được xác định trong
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]8. Nếu bạn tò mò những vị trí này là gì, bạn có thể in biến
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]8 như thế này:
Tuy nhiên, nếu tệp chúng tôi muốn nhập hoàn toàn ở một nơi khác, trước tiên chúng tôi sẽ phải nói với Python nơi để tìm bằng cách thêm các thư mục tìm kiếm vào
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]8. Trong ví dụ của chúng tôi, chúng tôi có thể viết trong
.py
1:Lưu ý rằng đường dẫn được nối với
import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[]8 là một đường dẫn tuyệt đối. Nếu chúng tôi sử dụng một đường dẫn tương đối, đường dẫn sẽ giải quyết khác nhau dựa trên thư mục mà người dùng đang chạy tập lệnh, không liên quan đến đường dẫn của ____ 21.
Để nối một thư mục liên quan đến tệp tập lệnh này, bạn có thể sử dụng .py
4 để lấy đường dẫn đầy đủ của tập lệnh hiện tại và xây dựng một đường dẫn đầy đủ để nhập từ đó. Trong .py
1 chúng ta có thể viết:
Phiên bản Python 3.4 trở lên cung cấp chức năng thông qua thư viện importlib
tích hợp cho phép chúng tôi tải bất kỳ tệp nào ở bất cứ đâu dưới dạng mô-đun Python, ngay cả khi tên tệp của tệp không kết thúc trong .py
[nó có thể có phần mở rộng tệp khác hoặc không có phần mở rộng tệp ở tất cả].
Lưu ý ở đây rằng tên tệp .py
8 không có phần mở rộng tệp. Trong trường hợp này, chúng tôi không thể sử dụng câu lệnh import
đơn giản để nhập tệp đó. Thay vào đó, chúng ta có thể viết trong .py
1:
Lưu ý rằng đường dẫn được truyền vào import
1 là một đường dẫn tuyệt đối.Nếu chúng tôi sử dụng một đường dẫn tương đối như import
2, đường dẫn sẽ giải quyết khác nhau dựa trên thư mục mà người dùng đang chạy tập lệnh, không liên quan đến đường dẫn của ____ 21.
Nếu chúng tôi muốn tham chiếu một tệp liên quan đến đường dẫn của tệp tập lệnh hiện tại của chúng tôi, chúng tôi có thể sử dụng .py
4 để trước để lấy đường dẫn của tệp tập lệnh hiện tại của chúng tôi và sau đó xây dựng một đường dẫn đầy đủ từ đó:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import importlib.machinery import importlib.util from pathlib import Path # Get path to mymodule script_dir = Path[ __file__ ].parent mymodule_path = str[ script_dir.joinpath[ '..', 'alpha', 'beta', 'mymodule' ] ] # Import mymodule loader = importlib.machinery.SourceFileLoader[ 'mymodule', mymodule_path ] spec = importlib.util.spec_from_loader[ 'mymodule', loader ] mymodule = importlib.util.module_from_spec[ spec ] loader.exec_module[ mymodule ] # Use mymodule mymodule.say_hello[] |