importlib --- Việc triển khai import¶
Added in version 3.1.
Source code: Lib/importlib/__init__.py
Giới thiệu¶
Mục đích của gói importlib gồm có ba mục đích.
Một là cung cấp cách triển khai câu lệnh import (và do đó, theo phần mở rộng, hàm __import__()) trong mã nguồn Python. Điều này cung cấp cách triển khai import có thể di chuyển tới bất kỳ trình thông dịch Python nào. Điều này cũng cung cấp cách triển khai dễ hiểu hơn so với cách triển khai bằng ngôn ngữ lập trình khác ngoài Python.
Thứ hai, các thành phần để triển khai import được hiển thị trong gói này, giúp người dùng dễ dàng tạo các đối tượng tùy chỉnh của riêng họ (được gọi chung là importer) để tham gia vào quá trình nhập.
Thứ ba, gói chứa các mô-đun hiển thị chức năng bổ sung để quản lý các khía cạnh của gói Python:
importlib.metadatacung cấp quyền truy cập vào siêu dữ liệu từ các bản phân phối của bên thứ ba.importlib.resourcescung cấp các quy trình để truy cập "tài nguyên" không phải mã từ các gói Python.
Xem thêm
- Tuyên bố import
Tham chiếu ngôn ngữ cho câu lệnh
import.- Packages specification
Đặc điểm kỹ thuật ban đầu của gói. Một số ngữ nghĩa đã thay đổi kể từ khi viết tài liệu này (ví dụ: chuyển hướng dựa trên
Nonetrongsys.modules).- Chức năng
__import__() Câu lệnh
importlà cú pháp cho hàm này.- Việc khởi tạo đường dẫn tìm kiếm mô-đun sys.path
Việc khởi tạo
sys.path.- PEP 235
Nhập trên nền tảng không phân biệt chữ hoa chữ thường
- PEP 263
Xác định mã hóa mã nguồn Python
- PEP 302
Móc nhập khẩu mới
- PEP 328
Nhập khẩu: Nhiều dòng và Tuyệt đối/Tương đối
- PEP 366
Mô-đun chính nhập tương đối rõ ràng
- PEP 420
Gói không gian tên ngầm định
- PEP 451
Loại ModuleSpec cho hệ thống nhập
- PEP 488
Loại bỏ các tập tin PYO
- PEP 489
Khởi tạo mô-đun mở rộng nhiều pha
- PEP 552
pycs xác định
- PEP 3120
Sử dụng UTF-8 làm Mã hóa nguồn mặc định
- PEP 3147
Thư mục lưu trữ PYC
Chức năng¶
- importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)¶
Triển khai chức năng
__import__()tích hợp.Ghi chú
Việc nhập mô-đun theo chương trình nên sử dụng
import_module()thay vì chức năng này.
- importlib.import_module(name, package=None)¶
Nhập một mô-đun. Đối số name chỉ định mô-đun nào cần nhập theo thuật ngữ tuyệt đối hoặc tương đối (ví dụ:
pkg.modhoặc..mod). Nếu tên được chỉ định theo thuật ngữ tương đối thì đối số package phải được đặt thành tên của gói đóng vai trò là điểm neo để phân giải tên gói (ví dụ:import_module('..mod', 'pkg.subpkg')sẽ nhậppkg.mod).Hàm
import_module()hoạt động như một trình bao bọc đơn giản hóa xung quanhimportlib.__import__(). Điều này có nghĩa là tất cả ngữ nghĩa của hàm đều bắt nguồn từimportlib.__import__(). Sự khác biệt quan trọng nhất giữa hai hàm này làimport_module()trả về gói hoặc mô-đun được chỉ định (ví dụ:pkg.mod), trong khi__import__()trả về gói hoặc mô-đun cấp cao nhất (ví dụ:pkg).Nếu bạn đang nhập động một mô-đun đã được tạo kể từ khi trình thông dịch bắt đầu thực thi (ví dụ: đã tạo tệp nguồn Python), bạn có thể cần phải gọi
invalidate_caches()để hệ thống nhập chú ý đến mô-đun mới.Thay đổi trong phiên bản 3.3: Các gói gốc được nhập tự động.
- importlib.invalidate_caches()¶
Vô hiệu hóa bộ nhớ đệm nội bộ của công cụ tìm được lưu trữ tại
sys.meta_path. Nếu một công cụ tìm triển khaiinvalidate_caches()thì nó sẽ được gọi để thực hiện việc vô hiệu hóa. Hàm này sẽ được gọi nếu bất kỳ mô-đun nào được tạo/cài đặt trong khi chương trình của bạn đang chạy để đảm bảo tất cả người tìm thấy sẽ nhận thấy sự tồn tại của mô-đun mới.Added in version 3.3.
Thay đổi trong phiên bản 3.10: Các gói không gian tên được tạo/cài đặt ở một vị trí
sys.pathkhác sau khi cùng một không gian tên đã được nhập sẽ được chú ý.
- importlib.reload(module)¶
Tải lại module đã nhập trước đó. Đối số phải là một đối tượng mô-đun, vì vậy nó phải được nhập thành công trước đó. Điều này hữu ích nếu bạn đã chỉnh sửa tệp nguồn mô-đun bằng trình chỉnh sửa bên ngoài và muốn dùng thử phiên bản mới mà không cần thoát khỏi trình thông dịch Python. Giá trị trả về là đối tượng mô-đun (có thể khác nếu việc nhập lại khiến một đối tượng khác được đặt trong
sys.modules).Khi
reload()được thực thi:Mã của mô-đun Python được biên dịch lại và mã cấp mô-đun được thực thi lại, xác định một tập hợp đối tượng mới được liên kết với các tên trong từ điển của mô-đun bằng cách sử dụng lại loader đã tải mô-đun ban đầu. Chức năng
initcủa mô-đun mở rộng không được gọi lần thứ hai.Giống như tất cả các đối tượng khác trong Python, các đối tượng cũ chỉ được lấy lại sau khi số lượng tham chiếu của chúng giảm xuống 0.
Tên trong không gian tên mô-đun được cập nhật để trỏ đến bất kỳ đối tượng mới hoặc thay đổi nào.
Các tham chiếu khác đến đối tượng cũ (chẳng hạn như tên bên ngoài mô-đun) không được phục hồi để tham chiếu đến đối tượng mới và phải được cập nhật trong từng không gian tên nơi chúng xuất hiện nếu muốn.
Có một số lưu ý khác:
Khi một mô-đun được tải lại, từ điển của nó (chứa các biến toàn cục của mô-đun) sẽ được giữ lại. Việc xác định lại tên sẽ ghi đè các định nghĩa cũ, vì vậy đây thường không phải là vấn đề. Nếu phiên bản mới của mô-đun không xác định tên đã được xác định bởi phiên bản cũ thì định nghĩa cũ vẫn giữ nguyên. Tính năng này có thể được sử dụng để tạo lợi thế cho mô-đun nếu nó duy trì một bảng chung hoặc bộ nhớ đệm của các đối tượng --- với câu lệnh
try, nó có thể kiểm tra sự hiện diện của bảng và bỏ qua quá trình khởi tạo nếu muốn:thử: bộ nhớ đệm ngoại trừ TênError: bộ đệm = {}
Nói chung, việc tải lại các mô-đun được tải sẵn hoặc được tải động thường không hữu ích lắm. Không nên tải lại
sys,__main__,builtinsvà các mô-đun chính khác. Trong nhiều trường hợp, các mô-đun mở rộng không được thiết kế để khởi tạo nhiều lần và có thể bị lỗi theo những cách tùy ý khi tải lại.Nếu một mô-đun nhập các đối tượng từ một mô-đun khác bằng cách sử dụng
from...import..., việc gọireload()cho mô-đun kia sẽ không xác định lại các đối tượng được nhập từ nó --- một cách để giải quyết vấn đề này là thực thi lại câu lệnhfrom, một cách khác là sử dụngimportvà các tên đủ điều kiện (module.name).Nếu một mô-đun khởi tạo các thể hiện của một lớp, việc tải lại mô-đun xác định lớp đó sẽ không ảnh hưởng đến các định nghĩa phương thức của các thể hiện --- chúng tiếp tục sử dụng định nghĩa lớp cũ. Điều này cũng đúng với các lớp dẫn xuất.
Added in version 3.4.
Thay đổi trong phiên bản 3.7:
ModuleNotFoundErrorđược nâng lên khi mô-đun được tải lại thiếuModuleSpec.Cảnh báo
Chức năng này không an toàn cho luồng. Gọi nó từ nhiều luồng có thể dẫn đến hành vi không mong muốn. Bạn nên sử dụng
threading.Lockhoặc các nguyên tắc đồng bộ hóa nguyên thủy khác để tải lại mô-đun an toàn theo luồng.
importlib.abc -- Các lớp cơ sở trừu tượng liên quan đến nhập khẩu¶
Source code: Lib/importlib/abc.py
Mô-đun importlib.abc chứa tất cả các lớp cơ sở trừu tượng cốt lõi được import sử dụng. Một số lớp con của các lớp cơ sở trừu tượng cốt lõi cũng được cung cấp để trợ giúp triển khai các ABC cốt lõi.
hệ thống phân cấp ABC:
vật thể
+-- MetaPathFinder
+-- PathEntryFinder
+-- Bộ nạp
+-- Trình tải tài nguyên --------+
+-- Kiểm traLoader |
+-- Trình tải thực thi --+
+-- Trình tải tệp
+-- Trình tải nguồn
- class importlib.abc.MetaPathFinder¶
Một lớp cơ sở trừu tượng đại diện cho meta path finder.
Added in version 3.3.
Thay đổi trong phiên bản 3.10: Không còn là lớp con của
Finder.- find_spec(fullname, path, target=None)¶
Một phương pháp trừu tượng để tìm spec cho mô-đun được chỉ định. Nếu đây là lần nhập cấp cao nhất, path sẽ là
None. Nếu không, đây là tìm kiếm gói con hoặc mô-đun và path sẽ là giá trị của__path__từ gói mẹ. Nếu không tìm thấy thông số kỹ thuật,Nonesẽ được trả về. Khi được truyền vào,targetlà một đối tượng mô-đun mà công cụ tìm có thể sử dụng để đưa ra dự đoán chính xác hơn về thông số kỹ thuật cần trả về.importlib.util.spec_from_loader()có thể hữu ích cho việc triển khaiMetaPathFinderscụ thể.Added in version 3.4.
- invalidate_caches()¶
Một phương thức tùy chọn, khi được gọi, sẽ vô hiệu hóa mọi bộ nhớ đệm bên trong được Finder sử dụng. Được sử dụng bởi
importlib.invalidate_caches()khi vô hiệu hóa bộ đệm của tất cả các công cụ tìm kiếm trênsys.meta_path.Thay đổi trong phiên bản 3.4: Trả về
Nonekhi được gọi thay vìNotImplemented.
- class importlib.abc.PathEntryFinder¶
Một lớp cơ sở trừu tượng đại diện cho path entry finder. Mặc dù có một số điểm tương đồng với
MetaPathFinder, nhưngPathEntryFinderchỉ được sử dụng trong hệ thống con nhập dựa trên đường dẫn doimportlib.machinery.PathFindercung cấp.Added in version 3.3.
Thay đổi trong phiên bản 3.10: Không còn là lớp con của
Finder.- find_spec(fullname, target=None)¶
Một phương pháp trừu tượng để tìm spec cho mô-đun được chỉ định. Công cụ tìm kiếm sẽ chỉ tìm kiếm mô-đun trong path entry mà nó được gán. Nếu không tìm thấy thông số kỹ thuật,
Nonesẽ được trả về. Khi được truyền vào,targetlà một đối tượng mô-đun mà công cụ tìm kiếm có thể sử dụng để đưa ra dự đoán chính xác hơn về thông số kỹ thuật cần trả về.importlib.util.spec_from_loader()có thể hữu ích cho việc triển khaiPathEntryFindersbê tông.Added in version 3.4.
- invalidate_caches()¶
Một phương thức tùy chọn, khi được gọi, sẽ vô hiệu hóa mọi bộ nhớ đệm bên trong được Finder sử dụng. Được sử dụng bởi
importlib.machinery.PathFinder.invalidate_caches()khi vô hiệu hóa bộ đệm của tất cả các công cụ tìm được lưu trong bộ nhớ đệm.
- class importlib.abc.Loader¶
Một lớp cơ sở trừu tượng cho loader. Xem PEP 302 để biết định nghĩa chính xác cho trình tải.
Các trình tải muốn hỗ trợ việc đọc tài nguyên phải triển khai phương thức
get_resource_reader()như được chỉ định bởiimportlib.resources.abc.ResourceReader.Thay đổi trong phiên bản 3.7: Giới thiệu phương pháp
get_resource_reader()tùy chọn.- create_module(spec)¶
Một phương thức trả về đối tượng mô-đun để sử dụng khi nhập mô-đun. Phương thức này có thể trả về
None, cho biết rằng ngữ nghĩa tạo mô-đun mặc định sẽ diễn ra.Added in version 3.4.
Thay đổi trong phiên bản 3.6: Phương pháp này không còn tùy chọn khi
exec_module()được xác định.
- exec_module(module)¶
Một phương thức trừu tượng thực thi mô-đun trong không gian tên của chính nó khi mô-đun được nhập hoặc tải lại. Mô-đun này phải được khởi tạo khi
exec_module()được gọi. Khi phương thức này tồn tại,create_module()phải được xác định.Added in version 3.4.
Thay đổi trong phiên bản 3.6:
create_module()cũng phải được xác định.
- load_module(fullname)¶
Một phương pháp cũ để tải mô-đun. Nếu không thể tải mô-đun,
ImportErrorsẽ được nâng lên, nếu không thì mô-đun đã tải sẽ được trả về.Nếu mô-đun được yêu cầu đã tồn tại trong
sys.modulesthì mô-đun đó sẽ được sử dụng và tải lại. Nếu không, trình tải sẽ tạo một mô-đun mới và chèn nó vàosys.modulestrước khi bất kỳ quá trình tải nào bắt đầu, để ngăn chặn việc đệ quy từ quá trình nhập. Nếu trình tải đã chèn một mô-đun và tải không thành công, thì trình tải đó phải loại bỏ mô-đun đó khỏisys.modules; các mô-đun đã có trongsys.modulestrước khi trình tải bắt đầu thực thi nên được giữ nguyên.Trình tải nên đặt một số thuộc tính trên mô-đun (lưu ý rằng một số thuộc tính này có thể thay đổi khi mô-đun được tải lại):
module.__cached__(deprecated)module.__package__(deprecated)module.__loader__(deprecated)
Khi
exec_module()khả dụng thì chức năng tương thích ngược sẽ được cung cấp.Thay đổi trong phiên bản 3.4: Tăng
ImportErrorkhi được gọi thay vìNotImplementedError. Chức năng được cung cấp khiexec_module()có sẵn.Không được dùng nữa kể từ phiên bản 3.4, sẽ bị xóa trong phiên bản 3.15: Zz005zz được đề xuất để tải mô-đun là
exec_module()(vàcreate_module()). Trình tải nên triển khai nó thay vìload_module(). Bộ máy nhập khẩu đảm nhận tất cả các trách nhiệm khác củaload_module()khiexec_module()được triển khai.
- class importlib.abc.ResourceLoader¶
Superseded by TraversableResources
Một lớp cơ sở trừu tượng cho loader thực hiện giao thức PEP 302 tùy chọn để tải các tài nguyên tùy ý từ back-end lưu trữ.
Sắp loại bỏ từ phiên bản 3.7: Zz001zz này không được dùng nữa để hỗ trợ tải tài nguyên thông qua
importlib.resources.abc.TraversableResources. Lớp này tồn tại chỉ để tương thích ngược với các ABC khác trong mô-đun này.- abstractmethod get_data(path)¶
Một phương thức trừu tượng để trả về byte cho dữ liệu nằm ở path. Các trình tải có phần phụ trợ lưu trữ giống như tệp cho phép lưu trữ dữ liệu tùy ý có thể triển khai phương pháp trừu tượng này để cấp quyền truy cập trực tiếp vào dữ liệu được lưu trữ.
OSErrorsẽ được nâng lên nếu không tìm thấy path. Zz005zz dự kiến sẽ được xây dựng bằng thuộc tính__file__của mô-đun hoặc một mục từ__path__của gói.Thay đổi trong phiên bản 3.4: Tăng
OSErrorthay vìNotImplementedError.
- class importlib.abc.InspectLoader¶
Một lớp cơ sở trừu tượng dành cho loader triển khai giao thức PEP 302 tùy chọn dành cho các trình tải kiểm tra mô-đun.
- get_code(fullname)¶
Trả về đối tượng mã cho một mô-đun hoặc
Nonenếu mô-đun không có đối tượng mã (chẳng hạn như trường hợp đối với mô-đun tích hợp). TăngImportErrornếu trình tải không thể tìm thấy mô-đun được yêu cầu.Ghi chú
Mặc dù phương thức này có cách triển khai mặc định nhưng bạn nên ghi đè nó nếu có thể để đảm bảo hiệu suất.
Thay đổi trong phiên bản 3.4: Không còn trừu tượng nữa và việc triển khai cụ thể được cung cấp.
- abstractmethod get_source(fullname)¶
Một phương thức trừu tượng để trả về nguồn của mô-đun. Nó được trả về dưới dạng chuỗi văn bản bằng cách sử dụng universal newlines, dịch tất cả các dấu phân cách dòng được nhận dạng thành các ký tự
'\n'. Trả vềNonenếu không có nguồn nào (ví dụ: mô-đun tích hợp). TăngImportErrornếu trình tải không thể tìm thấy mô-đun được chỉ định.Thay đổi trong phiên bản 3.4: Tăng
ImportErrorthay vìNotImplementedError.
- is_package(fullname)¶
Một phương thức tùy chọn để trả về giá trị đúng nếu mô-đun là một gói, nếu không thì trả về giá trị sai.
ImportErrorđược nâng lên nếu loader không thể tìm thấy mô-đun.Thay đổi trong phiên bản 3.4: Tăng
ImportErrorthay vìNotImplementedError.
- static source_to_code(data, path='<string>')¶
Tạo một đối tượng mã từ nguồn Python.
Đối số data có thể là bất kỳ đối số nào mà hàm
compile()hỗ trợ (tức là chuỗi hoặc byte). Đối số path phải là "đường dẫn" đến nơi mã nguồn bắt nguồn, có thể là một khái niệm trừu tượng (ví dụ: vị trí trong tệp zip).Với đối tượng mã tiếp theo, người ta có thể thực thi nó trong một mô-đun bằng cách chạy
exec(code, module.__dict__).Added in version 3.4.
Thay đổi trong phiên bản 3.5: Làm cho phương thức trở nên tĩnh.
- exec_module(module)¶
Triển khai
Loader.exec_module().Added in version 3.4.
- load_module(fullname)¶
Triển khai
Loader.load_module().Không được dùng nữa kể từ phiên bản 3.4, sẽ bị xóa trong phiên bản 3.15: thay vào đó hãy sử dụng
exec_module().
- class importlib.abc.ExecutionLoader¶
Một lớp cơ sở trừu tượng kế thừa từ
InspectLoader, khi được triển khai sẽ giúp mô-đun được thực thi dưới dạng tập lệnh. ABC đại diện cho một giao thức PEP 302 tùy chọn.- abstractmethod get_filename(fullname)¶
Một phương thức trừu tượng trả về giá trị
__file__cho mô-đun đã chỉ định. Nếu không có đường dẫn nào,ImportErrorsẽ được nâng lên.Nếu mã nguồn có sẵn thì phương thức sẽ trả về đường dẫn đến tệp nguồn, bất kể mã byte có được sử dụng để tải mô-đun hay không.
Thay đổi trong phiên bản 3.4: Tăng
ImportErrorthay vìNotImplementedError.
- class importlib.abc.FileLoader(fullname, path)¶
Một lớp cơ sở trừu tượng kế thừa từ
ResourceLoadervàExecutionLoader, cung cấp các triển khai cụ thể củaResourceLoader.get_data()vàExecutionLoader.get_filename().Đối số fullname là tên được phân giải đầy đủ của mô-đun mà trình tải sẽ xử lý. Đối số path là đường dẫn đến tệp cho mô-đun.
Added in version 3.3.
- name¶
Tên của mô-đun mà trình tải có thể xử lý.
- path¶
Đường dẫn đến tập tin của mô-đun.
- load_module(fullname)¶
Gọi siêu
load_module().Không được dùng nữa kể từ phiên bản 3.4, sẽ bị xóa trong phiên bản 3.15: Thay vào đó hãy sử dụng
Loader.exec_module().
- abstractmethod get_data(path)¶
Đọc path dưới dạng tệp nhị phân và trả về byte từ tệp đó.
- class importlib.abc.SourceLoader¶
Một lớp cơ sở trừu tượng để triển khai tải tệp nguồn (và mã byte tùy chọn). Lớp kế thừa từ cả
ResourceLoadervàExecutionLoader, yêu cầu triển khai:ExecutionLoader.get_filename()Chỉ nên trả lại đường dẫn đến tệp nguồn; tải không nguồn không được hỗ trợ.
Các phương thức trừu tượng được định nghĩa bởi lớp này là để thêm hỗ trợ tệp mã byte tùy chọn. Việc không triển khai các phương thức tùy chọn này (hoặc khiến chúng tăng
NotImplementedError) khiến trình tải chỉ hoạt động với mã nguồn. Việc triển khai các phương thức này cho phép trình tải hoạt động với các tệp mã byte and nguồn; nó không cho phép tải sourceless khi chỉ cung cấp mã byte. Các tệp mã byte là một sự tối ưu hóa để tăng tốc độ tải bằng cách loại bỏ bước phân tích cú pháp của trình biên dịch Python và do đó không có API dành riêng cho mã byte nào bị lộ.- path_stats(path)¶
Phương thức trừu tượng tùy chọn trả về
dictchứa siêu dữ liệu về đường dẫn đã chỉ định. Các khóa từ điển được hỗ trợ là:'mtime'(bắt buộc): số nguyên hoặc số dấu phẩy động biểu thị thời gian sửa đổi mã nguồn;'size'(tùy chọn): kích thước tính bằng byte của mã nguồn.
Mọi khóa khác trong từ điển đều bị bỏ qua để cho phép mở rộng trong tương lai. Nếu không thể xử lý được đường dẫn,
OSErrorsẽ được nâng lên.Added in version 3.3.
Thay đổi trong phiên bản 3.4: Tăng
OSErrorthay vìNotImplementedError.
- path_mtime(path)¶
Phương thức trừu tượng tùy chọn trả về thời gian sửa đổi cho đường dẫn đã chỉ định.
Sắp loại bỏ từ phiên bản 3.3: Phương pháp này không được dùng nữa vì
path_stats(). Bạn không cần phải triển khai nó nhưng nó vẫn có sẵn cho mục đích tương thích. TăngOSErrornếu không thể xử lý được đường dẫn.Thay đổi trong phiên bản 3.4: Tăng
OSErrorthay vìNotImplementedError.
- set_data(path, data)¶
Phương thức trừu tượng tùy chọn ghi các byte đã chỉ định vào đường dẫn tệp. Bất kỳ thư mục trung gian nào không tồn tại sẽ được tạo tự động.
Khi ghi vào đường dẫn không thành công do đường dẫn ở chế độ chỉ đọc (
errno.EACCES/PermissionError), không truyền ngoại lệ.Thay đổi trong phiên bản 3.4: Không còn tăng
NotImplementedErrorkhi được gọi.
- get_code(fullname)¶
Triển khai cụ thể
InspectLoader.get_code().
- exec_module(module)¶
Triển khai cụ thể
Loader.exec_module().Added in version 3.4.
- load_module(fullname)¶
Triển khai cụ thể
Loader.load_module().Không được dùng nữa kể từ phiên bản 3.4, sẽ bị xóa trong phiên bản 3.15: Thay vào đó hãy sử dụng
exec_module().
- get_source(fullname)¶
Triển khai cụ thể
InspectLoader.get_source().
- is_package(fullname)¶
Triển khai cụ thể
InspectLoader.is_package(). Một mô-đun được xác định là một gói nếu đường dẫn tệp của nó (doExecutionLoader.get_filename()cung cấp) là một tệp có tên__init__khi phần mở rộng tệp bị xóa and thì tên mô-đun không kết thúc bằng__init__.
importlib.machinery -- Trình nhập và móc đường dẫn¶
Source code: Lib/importlib/machinery.py
Mô-đun này chứa các đối tượng khác nhau giúp import tìm và tải mô-đun.
- importlib.machinery.SOURCE_SUFFIXES¶
Danh sách các chuỗi đại diện cho hậu tố tệp được nhận dạng cho mô-đun nguồn.
Added in version 3.3.
- importlib.machinery.DEBUG_BYTECODE_SUFFIXES¶
Danh sách các chuỗi biểu thị hậu tố tệp cho các mô-đun mã byte không được tối ưu hóa.
Added in version 3.3.
Sắp loại bỏ từ phiên bản 3.5: Thay vào đó hãy sử dụng
BYTECODE_SUFFIXES.
- importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES¶
Danh sách các chuỗi biểu thị hậu tố tệp cho các mô-đun mã byte được tối ưu hóa.
Added in version 3.3.
Sắp loại bỏ từ phiên bản 3.5: Thay vào đó hãy sử dụng
BYTECODE_SUFFIXES.
- importlib.machinery.BYTECODE_SUFFIXES¶
Danh sách các chuỗi biểu thị hậu tố tệp được nhận dạng cho mô-đun mã byte (bao gồm cả dấu chấm ở đầu).
Added in version 3.3.
Thay đổi trong phiên bản 3.5: Giá trị không còn phụ thuộc vào
__debug__.
- importlib.machinery.EXTENSION_SUFFIXES¶
Danh sách các chuỗi đại diện cho hậu tố tệp được nhận dạng cho các mô-đun mở rộng.
Added in version 3.3.
- importlib.machinery.all_suffixes()¶
Trả về danh sách kết hợp các chuỗi đại diện cho tất cả các hậu tố tệp cho các mô-đun được công cụ nhập tiêu chuẩn nhận dạng. Đây là một trình trợ giúp cho mã mà chỉ cần biết liệu đường dẫn hệ thống tệp có khả năng đề cập đến một mô-đun mà không cần bất kỳ chi tiết nào về loại mô-đun hay không (ví dụ:
inspect.getmodulename()).Added in version 3.3.
- class importlib.machinery.BuiltinImporter¶
Một importer cho các mô-đun tích hợp. Tất cả các mô-đun tích hợp đã biết đều được liệt kê trong
sys.builtin_module_names. Lớp này triển khai ABCimportlib.abc.MetaPathFindervàimportlib.abc.InspectLoader.Chỉ các phương thức lớp được xác định bởi lớp này để giảm bớt nhu cầu khởi tạo.
Thay đổi trong phiên bản 3.5: Là một phần của PEP 489, trình nhập nội dung hiện triển khai
Loader.create_module()vàLoader.exec_module()
- class importlib.machinery.FrozenImporter¶
Một importer cho các mô-đun bị đóng băng. Lớp này triển khai ABC
importlib.abc.MetaPathFindervàimportlib.abc.InspectLoader.Chỉ các phương thức lớp được xác định bởi lớp này để giảm bớt nhu cầu khởi tạo.
Thay đổi trong phiên bản 3.4: Đã đạt được phương pháp
create_module()vàexec_module().
- class importlib.machinery.WindowsRegistryFinder¶
Finder cho các mô-đun được khai báo trong sổ đăng ký Windows. Lớp này triển khai
importlib.abc.MetaPathFinderABC.Chỉ các phương thức lớp được xác định bởi lớp này để giảm bớt nhu cầu khởi tạo.
Added in version 3.3.
Sắp loại bỏ từ phiên bản 3.6: Thay vào đó hãy sử dụng cấu hình
site. Các phiên bản tương lai của Python có thể không bật công cụ tìm kiếm này theo mặc định.
- class importlib.machinery.PathFinder¶
Một Finder cho các thuộc tính
sys.pathvà gói__path__. Lớp này triển khaiimportlib.abc.MetaPathFinderABC.Chỉ các phương thức lớp được xác định bởi lớp này để giảm bớt nhu cầu khởi tạo.
- classmethod find_spec(fullname, path=None, target=None)¶
Phương thức lớp cố gắng tìm spec cho mô-đun được chỉ định bởi fullname trên
sys.pathhoặc, nếu được xác định, trên path. Đối với mỗi mục đường dẫn được tìm kiếm,sys.path_importer_cachesẽ được chọn. Nếu tìm thấy một đối tượng không sai thì nó sẽ được sử dụng làm path entry finder để tìm kiếm mô-đun đang được tìm kiếm. Nếu không tìm thấy mục nào trongsys.path_importer_cachethìsys.path_hookssẽ được tìm kiếm công cụ tìm cho mục nhập đường dẫn và nếu tìm thấy sẽ được lưu trữ trongsys.path_importer_cachecùng với việc được truy vấn về mô-đun. Nếu không tìm thấy công cụ tìm thấy nào thìNonesẽ được lưu trong bộ đệm và được trả về.Added in version 3.4.
Thay đổi trong phiên bản 3.5: Nếu thư mục làm việc hiện tại -- được biểu thị bằng một chuỗi trống -- không còn hợp lệ thì
Nonesẽ được trả về nhưng không có giá trị nào được lưu vào bộ đệm trongsys.path_importer_cache.
- classmethod invalidate_caches()¶
Gọi
importlib.abc.PathEntryFinder.invalidate_caches()trên tất cả các công cụ tìm được lưu trữ trongsys.path_importer_cachexác định phương thức. Nếu không, các mục trongsys.path_importer_cacheđược đặt thànhNonesẽ bị xóa.Thay đổi trong phiên bản 3.7: Các mục nhập của
Nonetrongsys.path_importer_cachesẽ bị xóa.
Thay đổi trong phiên bản 3.4: Gọi các đối tượng trong
sys.path_hooksvới thư mục làm việc hiện tại cho''(tức là chuỗi trống).
- class importlib.machinery.FileFinder(path, *loader_details)¶
Triển khai cụ thể
importlib.abc.PathEntryFinderđể lưu trữ kết quả từ hệ thống tệp.Đối số path là thư mục mà Finder chịu trách nhiệm tìm kiếm.
Đối số loader_details là một số lượng thay đổi gồm 2 bộ dữ liệu, mỗi bộ chứa một trình tải và một chuỗi hậu tố tệp mà trình tải nhận ra. Các trình tải được mong đợi là có thể gọi được, chấp nhận hai đối số về tên mô-đun và đường dẫn đến tệp được tìm thấy.
Công cụ tìm sẽ lưu vào bộ đệm nội dung thư mục nếu cần, thực hiện lệnh gọi thống kê cho từng tìm kiếm mô-đun để xác minh bộ đệm không bị lỗi thời. Vì độ ổn định của bộ nhớ đệm phụ thuộc vào mức độ chi tiết của thông tin trạng thái của hệ điều hành của hệ thống tệp nên có thể xảy ra tình trạng tương tranh khi tìm kiếm mô-đun, tạo tệp mới và sau đó tìm kiếm mô-đun mà tệp mới đại diện. Nếu các thao tác diễn ra đủ nhanh để phù hợp với mức độ chi tiết của lệnh gọi thống kê thì việc tìm kiếm mô-đun sẽ không thành công. Để ngăn điều này xảy ra, khi bạn tạo mô-đun động, hãy đảm bảo gọi
importlib.invalidate_caches().Added in version 3.3.
- path¶
Đường dẫn mà công cụ tìm kiếm sẽ tìm kiếm.
- find_spec(fullname, target=None)¶
Cố gắng tìm thông số kỹ thuật để xử lý fullname trong
path.Added in version 3.4.
- invalidate_caches()¶
Xóa bộ nhớ đệm nội bộ.
- classmethod path_hook(*loader_details)¶
Một phương thức lớp trả về một bao đóng để sử dụng trên
sys.path_hooks. Một phiên bản củaFileFinderđược trả về bởi bao đóng bằng cách sử dụng đối số đường dẫn được cung cấp cho bao đóng một cách trực tiếp và loader_details một cách gián tiếp.Nếu đối số cho việc đóng không phải là một thư mục hiện có,
ImportErrorsẽ được đưa ra.
- class importlib.machinery.SourceFileLoader(fullname, path)¶
Triển khai cụ thể
importlib.abc.SourceLoaderbằng cách phân lớpimportlib.abc.FileLoadervà cung cấp một số triển khai cụ thể của các phương pháp khác.Added in version 3.3.
- name¶
Tên của mô-đun mà trình tải này sẽ xử lý.
- path¶
Đường dẫn đến tập tin nguồn.
- path_stats(path)¶
Triển khai cụ thể
importlib.abc.SourceLoader.path_stats().
- set_data(path, data)¶
Triển khai cụ thể
importlib.abc.SourceLoader.set_data().
- load_module(name=None)¶
Triển khai cụ thể
importlib.abc.Loader.load_module()trong đó việc chỉ định tên mô-đun cần tải là tùy chọn.Không được dùng nữa kể từ phiên bản 3.6, sẽ bị xóa trong phiên bản 3.15: Thay vào đó hãy sử dụng
importlib.abc.Loader.exec_module().
- class importlib.machinery.SourcelessFileLoader(fullname, path)¶
Triển khai cụ thể
importlib.abc.FileLoadercó thể nhập tệp mã byte (tức là không tồn tại tệp mã nguồn).Xin lưu ý rằng việc sử dụng trực tiếp các tệp mã byte (và do đó không phải tệp mã nguồn) sẽ ngăn không cho các mô-đun của bạn có thể sử dụng được bởi tất cả các triển khai Python hoặc các phiên bản Python mới thay đổi định dạng mã byte.
Added in version 3.3.
- name¶
Tên của mô-đun mà trình tải sẽ xử lý.
- path¶
Đường dẫn đến tệp mã byte.
- get_source(fullname)¶
Trả về
Nonevì tệp mã byte không có nguồn khi sử dụng trình tải này.
- load_module(name=None)¶
Triển khai cụ thể
importlib.abc.Loader.load_module()trong đó việc chỉ định tên mô-đun cần tải là tùy chọn.Không được dùng nữa kể từ phiên bản 3.6, sẽ bị xóa trong phiên bản 3.15: Thay vào đó hãy sử dụng
importlib.abc.Loader.exec_module().
- class importlib.machinery.ExtensionFileLoader(fullname, path)¶
Triển khai cụ thể
importlib.abc.ExecutionLoadercho các mô-đun mở rộng.Đối số fullname chỉ định tên của mô-đun mà trình tải sẽ hỗ trợ. Đối số path là đường dẫn đến tệp của mô-đun mở rộng.
Lưu ý rằng, theo mặc định, việc nhập mô-đun mở rộng sẽ không thành công trong trình thông dịch con nếu nó không triển khai init nhiều pha (xem PEP 489), ngay cả khi nó nhập thành công.
Added in version 3.3.
Thay đổi trong phiên bản 3.12: Hiện tại, init nhiều pha được yêu cầu để sử dụng trong các trình thông dịch phụ.
- name¶
Tên của mô-đun mà trình tải hỗ trợ.
- path¶
Đường dẫn đến mô-đun mở rộng.
- is_package(fullname)¶
Trả về
Truenếu đường dẫn tệp trỏ đến mô-đun__init__của gói dựa trênEXTENSION_SUFFIXES.
- get_code(fullname)¶
Trả về
Nonekhi mô-đun mở rộng thiếu đối tượng mã.
- get_source(fullname)¶
Trả về
Nonevì các mô-đun mở rộng không có mã nguồn.
- class importlib.machinery.NamespaceLoader(name, path, path_finder)¶
Triển khai cụ thể
importlib.abc.InspectLoadercho các gói không gian tên. Đây là bí danh của một lớp riêng tư và chỉ được công khai để xem xét thuộc tính__loader__trên các gói không gian tên:>>> từ importlib.machinery nhập NamespaceLoader >>> nhập my_namespace >>> isinstance(my_namespace.__loader__, NamespaceLoader) đúng >>> nhập importlib.abc >>> isinstance(my_namespace.__loader__, importlib.abc.Loader) đúng
Added in version 3.11.
- class importlib.machinery.ModuleSpec(name, loader, *, origin=None, loader_state=None, is_package=None)¶
Thông số kỹ thuật cho trạng thái liên quan đến hệ thống nhập của mô-đun. Điều này thường được hiển thị dưới dạng thuộc tính
__spec__của mô-đun. Nhiều thuộc tính trong số này cũng có sẵn trực tiếp trên mô-đun: ví dụ:module.__spec__.origin == module.__file__. Tuy nhiên, hãy lưu ý rằng mặc dù values thường tương đương nhau nhưng chúng có thể khác nhau do không có sự đồng bộ hóa giữa hai đối tượng. Ví dụ: có thể cập nhật__file__của mô-đun khi chạy và điều này sẽ không tự động được phản ánh trong__spec__.origincủa mô-đun và ngược lại.Added in version 3.4.
- name¶
Tên đủ điều kiện của mô-đun (xem
module.__name__). Zz001zz phải luôn đặt thuộc tính này thành một chuỗi không trống.
- loader¶
Zz000zz được sử dụng để tải mô-đun (xem
module.__loader__). Zz002zz phải luôn đặt thuộc tính này.
- origin¶
Vị trí mà loader nên sử dụng để tải mô-đun (xem
module.__file__). Ví dụ: đối với các mô-đun được tải từ tệp.pythì đây là tên tệp. finder phải luôn đặt thuộc tính này thành giá trị có ý nghĩa để loader sử dụng. Trong trường hợp hiếm gặp là không có gói nào (như đối với các gói không gian tên), nó phải được đặt thànhNone.
- submodule_search_locations¶
Một chuỗi sequence (có thể trống) liệt kê các vị trí mà các mô-đun con của gói sẽ được tìm thấy (xem
module.__path__). Hầu hết thời gian sẽ chỉ có một thư mục duy nhất trong danh sách này.Zz000zz phải đặt thuộc tính này thành một chuỗi, thậm chí là một chuỗi trống, để cho hệ thống nhập biết rằng mô-đun là một gói. Nó nên được đặt thành
Nonecho các mô-đun không phải gói. Sau này nó được đặt tự động thành một đối tượng đặc biệt cho các gói không gian tên.
- loader_state¶
Zz000zz có thể đặt thuộc tính này thành một đối tượng chứa dữ liệu bổ sung dành riêng cho mô-đun để sử dụng khi tải mô-đun. Nếu không thì nên đặt thành
None.
- cached¶
Tên tệp của phiên bản đã biên dịch của mã mô-đun (xem
module.__cached__). Zz001zz phải luôn đặt thuộc tính này nhưng có thể làNonecho các mô-đun không cần lưu trữ mã biên dịch.
- parent¶
(Chỉ đọc) Tên đủ điều kiện của gói chứa mô-đun (hoặc chuỗi trống cho mô-đun cấp cao nhất). Xem
module.__package__. Nếu mô-đun là một gói thì mô-đun này giống nhưname.
- class importlib.machinery.AppleFrameworkLoader(name, path)¶
Một chuyên môn của
importlib.machinery.ExtensionFileLoadercó thể tải các mô-đun mở rộng ở định dạng Framework.Để tương thích với iOS App Store, mô-đun nhị phân all trong ứng dụng iOS phải là thư viện động, nằm trong một khung có siêu dữ liệu phù hợp, được lưu trữ trong thư mục
Frameworkscủa ứng dụng đóng gói. Chỉ có thể có một tệp nhị phân duy nhất cho mỗi khung và không thể có tài liệu nhị phân thực thi nào bên ngoài thư mục Khung.Để đáp ứng yêu cầu này, khi chạy trên iOS, các tệp nhị phân của mô-đun mở rộng được not đóng gói dưới dạng tệp
.sotrênsys.pathnhưng dưới dạng các khung độc lập riêng lẻ. Để khám phá các khung đó, trình tải này được đăng ký dựa trên phần mở rộng tệp.fwork, với tệp.fworkđóng vai trò giữ chỗ ở vị trí ban đầu của tệp nhị phân trênsys.path. Tệp.fworkchứa đường dẫn của tệp nhị phân thực tế trong thư mụcFrameworks, liên quan đến gói ứng dụng. Để cho phép phân giải tệp nhị phân được đóng gói trong khung về vị trí ban đầu, khung phải chứa tệp.originchứa vị trí của tệp.fwork, liên quan đến gói ứng dụng.Ví dụ: hãy xem xét trường hợp nhập
from foo.bar import _whiz, trong đó_whizđược triển khai với mô-đun nhị phânsources/foo/bar/_whiz.abi3.so, vớisourceslà vị trí được đăng ký trênsys.path, liên quan đến gói ứng dụng. Mô-đun must này được phân phối dưới dạngFrameworks/foo.bar._whiz.framework/foo.bar._whiz(tạo tên khung từ đường dẫn nhập đầy đủ của mô-đun), với tệpInfo.plisttrong thư mục.frameworkxác định tệp nhị phân làm khung. Mô-đunfoo.bar._whizsẽ được biểu thị ở vị trí ban đầu bằng tệp đánh dấusources/foo/bar/_whiz.abi3.fwork, chứa đường dẫnFrameworks/foo.bar._whiz/foo.bar._whiz. Khung này cũng sẽ chứaFrameworks/foo.bar._whiz.framework/foo.bar._whiz.origin, chứa đường dẫn đến tệp.fwork.Khi một mô-đun được tải bằng trình tải này,
__file__cho mô-đun sẽ báo cáo là vị trí của tệp.fwork. Điều này cho phép mã sử dụng__file__của mô-đun làm điểm neo để truyền tải hệ thống tệp. Tuy nhiên, nguồn gốc thông số kỹ thuật sẽ tham chiếu vị trí của tệp nhị phân actual trong thư mục.framework.Dự án Xcode xây dựng ứng dụng chịu trách nhiệm chuyển đổi bất kỳ tệp
.sonào từ bất kỳ nơi nào chúng tồn tại trongPYTHONPATHthành các khung trong thư mụcFrameworks(bao gồm loại bỏ các phần mở rộng khỏi tệp mô-đun, bổ sung siêu dữ liệu khung và ký vào khung kết quả) cũng như tạo các tệp.fworkvà.origin. Việc này thường được thực hiện bằng bước xây dựng trong dự án Xcode; xem tài liệu iOS để biết chi tiết về cách xây dựng bước xây dựng này.Added in version 3.13.
sẵn có: iOS.
- name¶
Tên của mô-đun mà trình tải hỗ trợ.
- path¶
Đường dẫn đến tệp
.fworkcho mô-đun mở rộng.
importlib.util -- Mã tiện ích dành cho nhà nhập khẩu¶
Source code: Lib/importlib/util.py
Mô-đun này chứa các đối tượng khác nhau giúp xây dựng importer.
- importlib.util.MAGIC_NUMBER¶
Các byte đại diện cho số phiên bản mã byte. Nếu bạn cần trợ giúp về việc tải/ghi mã byte thì hãy xem xét
importlib.abc.SourceLoader.Added in version 3.4.
- importlib.util.cache_from_source(path, debug_override=None, *, optimization=None)¶
Trả lại đường dẫn PEP 3147/PEP 488 cho tệp được biên dịch theo byte được liên kết với nguồn path. Ví dụ: nếu path là
/foo/bar/baz.pythì giá trị trả về sẽ là/foo/bar/__pycache__/baz.cpython-32.pyccho Python 3.2. Chuỗicpython-32xuất phát từ thẻ ma thuật hiện tại (xemget_tag(); nếusys.implementation.cache_tagkhông được xác định thìNotImplementedErrorsẽ được nâng lên).Tham số optimization được sử dụng để chỉ định mức tối ưu hóa của tệp mã byte. Một chuỗi trống thể hiện không có sự tối ưu hóa, do đó,
/foo/bar/baz.pyvới optimization là''sẽ dẫn đến đường dẫn mã byte là/foo/bar/__pycache__/baz.cpython-32.pyc.Nonekhiến mức tối ưu hóa của trình thông dịch được sử dụng. Bất kỳ biểu diễn chuỗi của giá trị nào khác đều được sử dụng, do đó,/foo/bar/baz.pyvới optimization là2sẽ dẫn đến đường dẫn mã byte của/foo/bar/__pycache__/baz.cpython-32.opt-2.pyc. Biểu diễn chuỗi của optimization chỉ có thể là chữ và số, nếu không thìValueErrorsẽ được nâng lên.Tham số debug_override không được dùng nữa và có thể được sử dụng để ghi đè giá trị của hệ thống cho
__debug__. Giá trịTruetương đương với việc đặt optimization thành chuỗi trống. Giá trịFalsegiống như cài đặt optimization thành1. Nếu cả debug_override và optimization đều không phải làNonethìTypeErrorsẽ được nâng lên.Added in version 3.4.
Thay đổi trong phiên bản 3.5: Tham số optimization đã được thêm và tham số debug_override không được dùng nữa.
Thay đổi trong phiên bản 3.6: Chấp nhận path-like object.
- importlib.util.source_from_cache(path)¶
Đặt path cho tên tệp PEP 3147, trả về đường dẫn tệp mã nguồn được liên kết. Ví dụ: nếu path là
/foo/bar/__pycache__/baz.cpython-32.pycthì đường dẫn trả về sẽ là/foo/bar/baz.py. path không cần phải tồn tại, tuy nhiên nếu nó không phù hợp với định dạng PEP 3147 hoặc PEP 488 thìValueErrorsẽ được nâng lên. Nếusys.implementation.cache_tagkhông được xác định,NotImplementedErrorsẽ được nâng lên.Added in version 3.4.
Thay đổi trong phiên bản 3.6: Chấp nhận path-like object.
- importlib.util.decode_source(source_bytes)¶
Giải mã các byte đã cho biểu thị mã nguồn và trả về dưới dạng một chuỗi với các dòng mới phổ quát (theo yêu cầu của
importlib.abc.InspectLoader.get_source()).Added in version 3.4.
- importlib.util.resolve_name(name, package)¶
Phân giải tên mô-đun tương đối thành tên tuyệt đối.
Nếu name không có dấu chấm ở đầu thì name sẽ được trả về đơn giản. Điều này cho phép sử dụng như
importlib.util.resolve_name('sys', __spec__.parent)mà không cần kiểm tra xem đối số package có cần thiết hay không.ImportErrorđược tăng lên nếu name là tên mô-đun tương đối nhưng package là giá trị sai (ví dụ:Nonehoặc chuỗi trống).ImportErrorcũng được nâng lên nếu một tên họ hàng thoát khỏi gói chứa nó (ví dụ: yêu cầu..bacontừ bên trong góispam).Added in version 3.3.
Thay đổi trong phiên bản 3.9: Để cải thiện tính nhất quán với các câu lệnh nhập, hãy tăng
ImportErrorthay vìValueErrorcho các lần nhập tương đối không hợp lệ.
- importlib.util.find_spec(name, package=None)¶
Tìm spec cho một mô-đun, tùy ý liên quan đến tên package đã chỉ định. Nếu mô-đun ở dạng
sys.modulesthìsys.modules[name].__spec__sẽ được trả về (trừ khi thông số kỹ thuật làNonehoặc không được đặt, trong trường hợp đóValueErrorđược nâng lên). Nếu không, việc tìm kiếm bằngsys.meta_pathsẽ được thực hiện.Noneđược trả về nếu không tìm thấy thông số kỹ thuật.Nếu name dành cho mô-đun con (chứa dấu chấm), mô-đun mẹ sẽ tự động được nhập.
name và package hoạt động tương tự như
import_module().Added in version 3.4.
Thay đổi trong phiên bản 3.7: Tăng
ModuleNotFoundErrorthay vìAttributeErrornếu package trên thực tế không phải là một gói (tức là thiếu thuộc tính__path__).
- importlib.util.module_from_spec(spec)¶
Tạo một mô-đun mới dựa trên spec và
spec.loader.create_module.Nếu
spec.loader.create_modulekhông trả vềNonethì mọi thuộc tính có sẵn sẽ không được đặt lại. Ngoài ra, sẽ không cóAttributeErrornào được nâng lên nếu được kích hoạt trong khi truy cập spec hoặc đặt thuộc tính trên mô-đun.Chức năng này được ưu tiên hơn so với việc sử dụng
types.ModuleTypeđể tạo mô-đun mới vì spec được sử dụng để đặt càng nhiều thuộc tính được kiểm soát nhập trên mô-đun càng tốt.Added in version 3.5.
- importlib.util.spec_from_loader(name, loader, *, origin=None, is_package=None)¶
Một hàm xuất xưởng để tạo phiên bản
ModuleSpecdựa trên trình tải. Các tham số có cùng ý nghĩa như đối với ModuleSpec. Hàm này sử dụng các API loader có sẵn, chẳng hạn nhưInspectLoader.is_package(), để điền mọi thông tin còn thiếu về thông số kỹ thuật.Added in version 3.4.
- importlib.util.spec_from_file_location(name, location, *, loader=None, submodule_search_locations=None)¶
Một hàm xuất xưởng để tạo phiên bản
ModuleSpecdựa trên đường dẫn đến tệp. Thông tin còn thiếu sẽ được điền vào thông số kỹ thuật bằng cách sử dụng API của trình tải và ngụ ý rằng mô-đun sẽ dựa trên tệp.Added in version 3.4.
Thay đổi trong phiên bản 3.6: Chấp nhận path-like object.
- importlib.util.source_hash(source_bytes)¶
Trả về hàm băm của source_bytes dưới dạng byte. Tệp
.pycdựa trên hàm băm nhúngsource_hash()của nội dung của tệp nguồn tương ứng vào tiêu đề của nó.Added in version 3.7.
- importlib.util._incompatible_extension_module_restrictions(*, disable_check)¶
Trình quản lý bối cảnh có thể tạm thời bỏ qua việc kiểm tra tính tương thích của các mô-đun mở rộng. Theo mặc định, kiểm tra được bật và sẽ thất bại khi mô-đun init một pha được nhập vào trình thông dịch phụ. Nó cũng sẽ không thành công đối với mô-đun init nhiều pha không hỗ trợ rõ ràng GIL cho mỗi trình thông dịch, khi được nhập vào một trình thông dịch có GIL của chính nó.
Lưu ý rằng chức năng này nhằm mục đích đáp ứng một trường hợp bất thường; một thứ có khả năng cuối cùng sẽ biến mất. Có khả năng khá cao đây không phải là thứ bạn đang tìm kiếm.
Bạn có thể đạt được hiệu quả tương tự như chức năng này bằng cách triển khai giao diện cơ bản của init nhiều pha (PEP 489) và nói dối về việc hỗ trợ nhiều trình thông dịch (hoặc GIL cho mỗi phiên dịch).
Cảnh báo
Việc sử dụng chức năng này để tắt tính năng kiểm tra có thể dẫn đến hành vi không mong muốn và thậm chí là treo máy. Nó chỉ nên được sử dụng trong quá trình phát triển mô-đun mở rộng.
Added in version 3.12.
- class importlib.util.LazyLoader(loader)¶
Một lớp trì hoãn việc thực thi trình tải của mô-đun cho đến khi mô-đun đó có thuộc tính được truy cập.
Lớp only này hoạt động với các trình tải xác định
exec_module()là cần phải kiểm soát loại mô-đun nào được sử dụng cho mô-đun đó. Vì những lý do tương tự, phương thứccreate_module()của trình tải phải trả vềNonehoặc một loại mà thuộc tính__class__của nó có thể bị thay đổi cùng với việc không sử dụng slots. Cuối cùng, các mô-đun thay thế đối tượng được đặt vàosys.modulessẽ không hoạt động vì không có cách nào thay thế chính xác các tham chiếu mô-đun trong toàn bộ trình thông dịch một cách an toàn;ValueErrorđược nâng lên nếu phát hiện sự thay thế như vậy.Ghi chú
Đối với các dự án mà thời gian khởi động là rất quan trọng, lớp này cho phép giảm thiểu chi phí tải mô-đun nếu nó không bao giờ được sử dụng. Đối với các dự án không cần thiết phải có thời gian khởi động thì việc sử dụng lớp này không được khuyến khích do các thông báo lỗi được tạo trong quá trình tải bị trì hoãn và do đó xảy ra ngoài ngữ cảnh.
Added in version 3.5.
Thay đổi trong phiên bản 3.6: Bắt đầu gọi
create_module(), xóa cảnh báo tương thích choimportlib.machinery.BuiltinImportervàimportlib.machinery.ExtensionFileLoader.- classmethod factory(loader)¶
Một phương thức lớp trả về một lệnh có thể gọi được để tạo ra một trình tải lười biếng. Điều này có nghĩa là được sử dụng trong các tình huống mà trình tải được truyền theo lớp thay vì theo thể hiện.
hậu tố = importlib.machinery.SOURCE_SUFFIXES bộ nạp = importlib.machinery.SourceFileLoader lười_loader = importlib.util.LazyLoader.factory(loader) finder = importlib.machinery.FileFinder(path, (lazy_loader, hậu tố))
Ví dụ¶
Nhập theo chương trình¶
Để nhập mô-đun theo chương trình, hãy sử dụng importlib.import_module().
nhập khẩu nhập khẩu
itertools = importlib.import_module('itertools')
Kiểm tra xem một mô-đun có thể được nhập hay không¶
Nếu bạn cần tìm hiểu xem một mô-đun có thể được nhập mà không thực sự thực hiện việc nhập hay không thì bạn nên sử dụng importlib.util.find_spec().
Lưu ý rằng nếu name là mô-đun con (chứa dấu chấm), importlib.util.find_spec() sẽ nhập mô-đun mẹ.
nhập importlib.util
hệ thống nhập khẩu
# For mục đích minh họa.
tên = 'itertools'
nếu tên trong sys.modules:
print(f"{name!r} đã có trong sys.modules")
Elif (spec := importlib.util.find_spec(name)) không phải là None:
# If bạn đã chọn thực hiện quá trình nhập thực tế ...
mô-đun = importlib.util.module_from_spec(spec)
sys.modules[name] = mô-đun
spec.loader.exec_module(mô-đun)
print(f"{name!r} đã được nhập")
khác:
print(f"không thể tìm thấy mô-đun {name!r}")
Nhập trực tiếp tệp nguồn¶
Nên sử dụng công thức này một cách thận trọng: nó là một công thức gần đúng của một câu lệnh nhập trong đó đường dẫn tệp được chỉ định trực tiếp, thay vì sys.path đang được tìm kiếm. Trước tiên, nên xem xét các giải pháp thay thế, chẳng hạn như sửa đổi sys.path khi cần một mô-đun thích hợp hoặc sử dụng runpy.run_path() khi không gian tên chung do chạy tệp Python là phù hợp.
Để nhập tệp nguồn Python trực tiếp từ một đường dẫn, hãy sử dụng công thức sau:
nhập importlib.util
hệ thống nhập khẩu
def import_from_path(module_name, file_path):
spec = importlib.util.spec_from_file_location(module_name, file_path)
mô-đun = importlib.util.module_from_spec(spec)
sys.modules[module_name] = mô-đun
spec.loader.exec_module(mô-đun)
mô-đun trả về
# For chỉ nhằm mục đích minh họa (việc sử dụng `json` là tùy ý).
nhập json
file_path = json.__file__
module_name = json.__name__
kết quả # Similar là `import json`.
json = import_from_path(module_name, file_path)
Thực hiện nhập khẩu lười biếng¶
Ví dụ bên dưới cho thấy cách triển khai nhập lười biếng:
>>> nhập importlib.util
>>> nhập hệ thống
>>> def lười_import(tên):
... spec = importlib.util.find_spec(name)
... trình tải = importlib.util.LazyLoader(spec.loader)
... spec.loader = trình tải
... mô-đun = importlib.util.module_from_spec(spec)
... sys.modules[name] = mô-đun
... Loader.exec_module(mô-đun)
... mô-đun trả về
...
>>> lười_typing = lười_import("gõ")
>>> #lazy_typing là một đối tượng mô-đun thực sự,
>>> #but nó chưa được tải vào bộ nhớ.
>>> lười_typing.TYPE_CHECKING
sai
Thiết lập nhà nhập khẩu¶
Để tùy chỉnh sâu quá trình nhập, bạn thường muốn triển khai importer. Điều này có nghĩa là quản lý cả hai mặt finder và loader. Đối với công cụ tìm, có hai loại để lựa chọn tùy theo nhu cầu của bạn: meta path finder hoặc path entry finder. Cái trước là thứ bạn sẽ đặt trên sys.meta_path trong khi cái sau là thứ bạn tạo bằng cách sử dụng path entry hook trên sys.path_hooks hoạt động với các mục sys.path để có khả năng tạo công cụ tìm. Ví dụ này sẽ chỉ cho bạn cách đăng ký trình nhập của riêng bạn để quá trình nhập sẽ sử dụng chúng (để tạo trình nhập cho chính bạn, hãy đọc tài liệu về các lớp thích hợp được xác định trong gói này):
nhập importlib.machinery
hệ thống nhập khẩu
# For chỉ nhằm mục đích minh họa.
SpamMetaPathFinder = importlib.machinery.PathFinder
SpamPathEntryFinder = importlib.machinery.FileFinder
Loader_details = (importlib.machinery.SourceFileLoader,
importlib.machinery.SOURCE_SUFFIXES)
# Setting lên một công cụ tìm đường dẫn meta.
# Make chắc chắn đặt công cụ tìm vào vị trí thích hợp trong danh sách về mặt
# priority.
sys.meta_path.append(SpamMetaPathFinder)
# Setting lên một công cụ tìm đường dẫn.
# Make chắc chắn đặt path hook vào đúng vị trí trong danh sách về mặt
ưu tiên # of.
sys.path_hooks.append(SpamPathEntryFinder.path_hook(loader_details))
Xấp xỉ importlib.import_module()¶
Bản thân quá trình nhập được triển khai bằng mã Python, giúp có thể hiển thị hầu hết máy móc nhập thông qua importlib. Phần sau đây giúp minh họa các API khác nhau mà importlib hiển thị bằng cách cung cấp cách triển khai gần đúng của importlib.import_module():
nhập importlib.util
hệ thống nhập khẩu
def import_module(name, package=None):
"""Việc triển khai nhập khẩu gần đúng."""
tuyệt đối_name = importlib.util.resolve_name(tên, gói)
thử:
trả về sys.modules[absolute_name]
ngoại trừ KeyError:
vượt qua
đường dẫn = Không có
nếu '.' trong tên_tuyệt đối:
parent_name, _, child_name = tuyệt đối_name.rpartition('.')
parent_module = import_module(parent_name)
đường dẫn = parent_module.__spec__.submodule_search_locations
cho công cụ tìm trong sys.meta_path:
spec = finder.find_spec(absolute_name, path)
nếu thông số kỹ thuật không phải là Không có:
phá vỡ
khác:
msg = f'Không có mô-đun nào có tên {absolute_name!r}'
raise ModuleNotFoundError(msg, name=absolute_name)
mô-đun = importlib.util.module_from_spec(spec)
sys.modules[absolute_name] = mô-đun
spec.loader.exec_module(mô-đun)
nếu đường dẫn không phải là Không:
setattr(parent_module, child_name, module)
mô-đun trả về