runpy --- Định vị và thực thi các mô-đun Python¶
Source code: Lib/runpy.py
Mô-đun runpy được sử dụng để định vị và chạy các mô-đun Python mà không cần nhập chúng trước. Công dụng chính của nó là triển khai chuyển đổi dòng lệnh -m cho phép định vị các tập lệnh bằng cách sử dụng không gian tên mô-đun Python thay vì hệ thống tệp.
Lưu ý rằng đây là not một mô-đun hộp cát - tất cả mã được thực thi trong quy trình hiện tại và mọi tác dụng phụ (chẳng hạn như nhập các mô-đun khác vào bộ nhớ đệm) sẽ vẫn giữ nguyên sau khi các chức năng quay trở lại.
Hơn nữa, mọi hàm và lớp được xác định bởi mã thực thi đều không được đảm bảo hoạt động chính xác sau khi hàm runpy trả về. Nếu giới hạn đó không được chấp nhận đối với một trường hợp sử dụng nhất định, importlib có thể là lựa chọn phù hợp hơn mô-đun này.
Mô-đun runpy cung cấp hai chức năng:
- runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)¶
Thực thi mã của mô-đun đã chỉ định và trả về từ điển toàn cầu của mô-đun kết quả. Mã của mô-đun trước tiên được định vị bằng cơ chế nhập tiêu chuẩn (tham khảo PEP 302 để biết chi tiết) và sau đó được thực thi trong không gian tên mô-đun mới.
Đối số mod_name phải là tên mô-đun tuyệt đối. Nếu tên mô-đun đề cập đến một gói chứ không phải một mô-đun thông thường thì gói đó sẽ được nhập và mô-đun con
__main__trong gói đó sẽ được thực thi và từ điển toàn cầu của mô-đun kết quả được trả về.Đối số từ điển tùy chọn init_globals có thể được sử dụng để điền trước từ điển toàn cục của mô-đun trước khi mã được thực thi. init_globals sẽ không được sửa đổi. Nếu bất kỳ biến toàn cục đặc biệt nào dưới đây được xác định trong init_globals, thì các định nghĩa đó sẽ bị
run_module()ghi đè.Các biến toàn cục đặc biệt
__name__,__spec__,__file__,__cached__,__loader__và__package__được đặt trong từ điển toàn cầu trước khi mã mô-đun được thực thi. (Lưu ý rằng đây là tập hợp biến tối thiểu - các biến khác có thể được đặt ngầm dưới dạng chi tiết triển khai trình thông dịch.)__name__được đặt thành run_name nếu đối số tùy chọn này không phải làNone, thànhmod_name + '.__main__'nếu mô-đun được đặt tên là một gói và đối số mod_name nếu ngược lại.__spec__sẽ được đặt phù hợp cho mô-đun nhập actually (nghĩa là__spec__.namesẽ luôn là mod_name hoặcmod_name + '.__main__', không bao giờ là run_name).__file__,__cached__,__loader__và__package__là set as normal dựa trên thông số kỹ thuật của mô-đun.Nếu đối số alter_sys được cung cấp và đánh giá thành
Truethìsys.argv[0]được cập nhật với giá trị__file__vàsys.modules[__name__]được cập nhật với một đối tượng mô-đun tạm thời cho mô-đun đang được thực thi. Cảsys.argv[0]vàsys.modules[__name__]đều được khôi phục về giá trị ban đầu trước khi hàm trả về.Lưu ý rằng thao tác
sysnày không an toàn cho luồng. Các luồng khác có thể thấy mô-đun được khởi tạo một phần cũng như danh sách các đối số đã thay đổi. Bạn nên để mô-đunsysmột mình khi gọi hàm này từ mã luồng.Xem thêm
Tùy chọn
-mcung cấp chức năng tương đương từ dòng lệnh.Thay đổi trong phiên bản 3.1: Đã thêm khả năng thực thi các gói bằng cách tìm kiếm mô-đun con
__main__.Thay đổi trong phiên bản 3.2: Đã thêm biến toàn cục
__cached__(xem PEP 3147).Thay đổi trong phiên bản 3.4: Đã cập nhật để tận dụng tính năng thông số mô-đun được thêm bởi PEP 451. Điều này cho phép
__cached__được đặt chính xác cho các mô-đun chạy theo cách này, cũng như đảm bảo tên mô-đun thực luôn có thể truy cập được là__spec__.name.Thay đổi trong phiên bản 3.12: Cài đặt
__cached__,__loader__và__package__không được dùng nữa. XemModuleSpecđể biết các lựa chọn thay thế.
- runpy.run_path(path_name, init_globals=None, run_name=None)¶
Thực thi mã tại vị trí hệ thống tệp được đặt tên và trả về từ điển toàn cầu của mô-đun kết quả. Giống như tên tập lệnh được cung cấp cho dòng lệnh CPython, file_path có thể đề cập đến tệp nguồn Python, tệp mã byte được biên dịch hoặc mục nhập
sys.pathhợp lệ chứa mô-đun__main__(ví dụ: tệp zip chứa tệp__main__.pycấp cao nhất).Đối với một tập lệnh đơn giản, mã được chỉ định sẽ được thực thi đơn giản trong không gian tên mô-đun mới. Đối với mục nhập
sys.pathhợp lệ (thường là tệp zip hoặc thư mục), mục nhập này trước tiên sẽ được thêm vào đầusys.path. Sau đó, hàm này sẽ tìm và thực thi mô-đun__main__bằng đường dẫn đã cập nhật. Lưu ý rằng không có biện pháp bảo vệ đặc biệt nào chống lại việc gọi mục nhập__main__hiện có nằm ở nơi khác trênsys.pathnếu không có mô-đun như vậy tại vị trí được chỉ định.Đối số từ điển tùy chọn init_globals có thể được sử dụng để điền trước từ điển toàn cục của mô-đun trước khi mã được thực thi. init_globals sẽ không được sửa đổi. Nếu bất kỳ biến toàn cục đặc biệt nào dưới đây được xác định trong init_globals, thì các định nghĩa đó sẽ bị
run_path()ghi đè.Các biến toàn cục đặc biệt
__name__,__spec__,__file__,__cached__,__loader__và__package__được đặt trong từ điển toàn cầu trước khi mã mô-đun được thực thi. (Lưu ý rằng đây là tập hợp biến tối thiểu - các biến khác có thể được đặt ngầm dưới dạng chi tiết triển khai trình thông dịch.)__name__được đặt thành run_name nếu đối số tùy chọn này không phải làNonevà nếu không thì là'<run_path>'.Nếu file_path tham chiếu trực tiếp đến tệp tập lệnh (dù là nguồn hay mã byte được biên dịch trước), thì
__file__sẽ được đặt thành file_path và__spec__,__cached__,__loader__và__package__đều sẽ được đặt thànhNone.Nếu file_path là tham chiếu đến mục nhập
sys.pathhợp lệ thì__spec__sẽ được đặt phù hợp cho mô-đun__main__đã nhập (nghĩa là__spec__.namesẽ luôn là__main__).__file__,__cached__,__loader__và__package__sẽ là set as normal dựa trên thông số kỹ thuật của mô-đun.Một số thay đổi cũng được thực hiện đối với mô-đun
sys. Thứ nhất,sys.pathcó thể được thay đổi như mô tả ở trên.sys.argv[0]được cập nhật với giá trị của file_path vàsys.modules[__name__]được cập nhật với một đối tượng mô-đun tạm thời cho mô-đun đang được thực thi. Tất cả các sửa đổi đối với các mục trongsysđều được hoàn nguyên trước khi hàm trả về.Lưu ý rằng, không giống như
run_module(), những thay đổi được thực hiện đối vớisyskhông phải là tùy chọn trong chức năng này vì những điều chỉnh này là cần thiết để cho phép thực thi các mụcsys.path. Vì các giới hạn về an toàn luồng vẫn được áp dụng nên việc sử dụng chức năng này trong mã luồng phải được tuần tự hóa bằng khóa nhập hoặc được ủy quyền cho một quy trình riêng biệt.Xem thêm
Tùy chọn giao diện để có chức năng tương đương trên dòng lệnh (
python path/to/script).Added in version 3.2.
Thay đổi trong phiên bản 3.4: Đã cập nhật để tận dụng tính năng thông số mô-đun được thêm bởi PEP 451. Điều này cho phép
__cached__được đặt chính xác trong trường hợp__main__được nhập từ mục nhậpsys.pathhợp lệ thay vì được thực thi trực tiếp.Thay đổi trong phiên bản 3.12: Cài đặt
__cached__,__loader__và__package__không được dùng nữa.
Xem thêm
- PEP 338 -- Thực thi các mô-đun dưới dạng tập lệnh
PEP được viết và triển khai bởi Nick Coghlan.
- PEP 366 -- Nhập khẩu tương đối rõ ràng của mô-đun chính
PEP được viết và triển khai bởi Nick Coghlan.
- PEP 451 -- Loại ModuleSpec cho hệ thống nhập
PEP được viết và triển khai bởi Eric Snow
Dòng lệnh và môi trường - Chi tiết dòng lệnh CPython
Chức năng importlib.import_module()