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.metadata cung 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.resources cung 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 None trong sys.modules).

Chức năng __import__()

Câu lệnh import là 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.mod hoặ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ập pkg.mod).

Hàm import_module() hoạt động như một trình bao bọc đơn giản hóa xung quanh importlib.__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 khai invalidate_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.path khá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 init củ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__, builtins và 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ọi reload() 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ệnh from, một cách khác là sử dụng import và 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ếu ModuleSpec.

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.Lock hoặ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, None sẽ được trả về. Khi được truyền vào, target là 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 khai MetaPathFinders cụ 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ên sys.meta_path.

Thay đổi trong phiên bản 3.4: Trả về None khi đượ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ưng PathEntryFinder chỉ được sử dụng trong hệ thống con nhập dựa trên đường dẫn do importlib.machinery.PathFinder cung 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, None sẽ được trả về. Khi được truyền vào, target là 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 khai PathEntryFinders bê 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ởi importlib.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, ImportError sẽ đượ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.modules thì 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ào sys.modules trướ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ỏi sys.modules; các mô-đun đã có trong sys.modules trướ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):

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 ImportError khi được gọi thay vì NotImplementedError. Chức năng được cung cấp khi exec_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ủa load_module() khi exec_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ữ. OSError sẽ đượ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 OSError thay 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 None nế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ăng ImportError nế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ề None nếu không có nguồn nào (ví dụ: mô-đun tích hợp). Tăng ImportError nế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 ImportError thay 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 ImportError thay 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, ImportError sẽ đượ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 ImportError thay vì NotImplementedError.

class importlib.abc.FileLoader(fullname, path)

Một lớp cơ sở trừu tượng kế thừa từ ResourceLoaderExecutionLoader, cung cấp các triển khai cụ thể của ResourceLoader.get_data()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_filename(fullname)

Trả về path.

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ả ResourceLoaderExecutionLoader, yêu cầu triển khai:

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ề dict chứ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, OSError sẽ được nâng lên.

Added in version 3.3.

Thay đổi trong phiên bản 3.4: Tăng OSError thay 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ăng OSError nếu không thể xử lý được đường dẫn.

Thay đổi trong phiên bản 3.4: Tăng OSError thay 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 NotImplementedError khi đượ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ó (do ExecutionLoader.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 ABC importlib.abc.MetaPathFinderimportlib.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()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.MetaPathFinderimportlib.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()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.MetaPathFinder ABC.

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.path và gói __path__. Lớp này triển khai importlib.abc.MetaPathFinder ABC.

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.path hoặ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_cache sẽ đượ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 trong sys.path_importer_cache thì sys.path_hooks sẽ đượ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ữ trong sys.path_importer_cache cù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ì None sẽ đượ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ì None sẽ được trả về nhưng không có giá trị nào được lưu vào bộ đệm trong sys.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ữ trong sys.path_importer_cache xác định phương thức. Nếu không, các mục trong sys.path_importer_cache được đặt thành None sẽ bị xóa.

Thay đổi trong phiên bản 3.7: Các mục nhập của None trong sys.path_importer_cache sẽ bị xóa.

Thay đổi trong phiên bản 3.4: Gọi các đối tượng trong sys.path_hooks vớ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ủa FileFinder đượ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ó, ImportError sẽ được đưa ra.

class importlib.machinery.SourceFileLoader(fullname, path)

Triển khai cụ thể importlib.abc.SourceLoader bằng cách phân lớp importlib.abc.FileLoader và 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.

is_package(fullname)

Trả về True nếu path xuất hiện cho một gói.

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.FileLoader có 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.

is_package(fullname)

Xác định xem mô-đun có phải là gói dựa trên path hay không.

get_code(fullname)

Trả về đối tượng mã cho name được tạo từ path.

get_source(fullname)

Trả về None vì 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.ExecutionLoader cho 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.

create_module(spec)

Tạo đối tượng mô-đun từ đặc tả đã cho theo PEP 489.

Added in version 3.5.

exec_module(module)

Khởi tạo đối tượng mô-đun đã cho theo PEP 489.

Added in version 3.5.

is_package(fullname)

Trả về True nếu đường dẫn tệp trỏ đến mô-đun __init__ của gói dựa trên EXTENSION_SUFFIXES.

get_code(fullname)

Trả về None khi mô-đun mở rộng thiếu đối tượng mã.

get_source(fullname)

Trả về None vì các mô-đun mở rộng không có mã nguồn.

get_filename(fullname)

Trả về path.

Added in version 3.4.

class importlib.machinery.NamespaceLoader(name, path, path_finder)

Triển khai cụ thể importlib.abc.InspectLoader cho 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__.origin củ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 .py thì đâ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ành None.

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 None cho 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à None cho 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.

has_location

True nếu origin của thông số kỹ thuật đề cập đến một vị trí có thể tải, nếu không thì False. Giá trị này tác động đến cách diễn giải origin và cách điền __file__ của mô-đun.

class importlib.machinery.AppleFrameworkLoader(name, path)

Một chuyên môn của importlib.machinery.ExtensionFileLoader có 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 Frameworks củ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 .so trên sys.path như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ên sys.path. Tệp .fwork chứa đường dẫn của tệp nhị phân thực tế trong thư mục Frameworks, 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 .origin chứ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ân sources/foo/bar/_whiz.abi3.so, với sources là vị trí được đăng ký trên sys.path, liên quan đến gói ứng dụng. Mô-đun must này được phân phối dưới dạng Frameworks/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ệp Info.plist trong thư mục .framework xác định tệp nhị phân làm khung. Mô-đun foo.bar._whiz sẽ được biểu thị ở vị trí ban đầu bằng tệp đánh dấu sources/foo/bar/_whiz.abi3.fwork, chứa đường dẫn Frameworks/foo.bar._whiz/foo.bar._whiz. Khung này cũng sẽ chứa Frameworks/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 .so nào từ bất kỳ nơi nào chúng tồn tại trong PYTHONPATH thành các khung trong thư mục Frameworks (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 .fwork.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 .fwork cho 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/foo/bar/baz.py thì giá trị trả về sẽ là /foo/bar/__pycache__/baz.cpython-32.pyc cho Python 3.2. Chuỗi cpython-32 xuất phát từ thẻ ma thuật hiện tại (xem get_tag(); nếu sys.implementation.cache_tag không được xác định thì NotImplementedError sẽ đượ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.py với optimization'' sẽ dẫn đến đường dẫn mã byte là /foo/bar/__pycache__/baz.cpython-32.pyc. None khiế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.py với optimization2 sẽ 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ì ValueError sẽ đượ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ị True tương đương với việc đặt optimization thành chuỗi trống. Giá trị False giống như cài đặt optimization thành 1. Nếu cả debug_overrideoptimization đều không phải là None thì TypeError sẽ đượ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/foo/bar/__pycache__/baz.cpython-32.pyc thì đườ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ì ValueError sẽ được nâng lên. Nếu sys.implementation.cache_tag không được xác định, NotImplementedError sẽ đượ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ụ: None hoặc chuỗi trống). ImportError cũ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 ..bacon từ bên trong gói spam).

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 ImportError thay vì ValueError cho 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.modules thì sys.modules[name].__spec__ sẽ được trả về (trừ khi thông số kỹ thuật là None hoặ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ằng sys.meta_path sẽ đượ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.

namepackage 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 ModuleNotFoundError thay vì AttributeError nế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 specspec.loader.create_module.

Nếu spec.loader.create_module không trả về None thì mọi thuộc tính có sẵn sẽ không được đặt lại. Ngoài ra, sẽ không có AttributeError nà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 ModuleSpec dự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 ModuleSpec dự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 .pyc dựa trên hàm băm nhúng source_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ức create_module() của trình tải phải trả về None hoặ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ào sys.modules sẽ 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 cho importlib.machinery.BuiltinImporterimportlib.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  None:
    # If bạn đã chọn thực hiện quá trình nhập thực tế ...
    -đun = importlib.util.module_from_spec(spec)
    sys.modules[name] = -đun
    spec.loader.exec_module(-đ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)
    -đun = importlib.util.module_from_spec(spec)
    sys.modules[module_name] = -đun
    spec.loader.exec_module(-đun)
    -đ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
... -đun = importlib.util.module_from_spec(spec)
... sys.modules[name] = -đun
... Loader.exec_module(-đun)
... -đ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 finderloader. Đố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 
    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  Không :
            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)
    -đun = importlib.util.module_from_spec(spec)
    sys.modules[absolute_name] = -đun
    spec.loader.exec_module(-đun)
    nếu đường dẫn không phải  Không:
        setattr(parent_module, child_name, module)
    -đun trả về