Trong Python 3.4 trở lên, bạn có thể nhập trực tiếp từ tệp nguồn (liên kết đến tài liệu) . Đây không phải là giải pháp đơn giản nhất, nhưng tôi bao gồm câu trả lời này cho đầy đủ.
Đây là một ví dụ. Đầu tiên, tập tin được nhập, có tên foo.py
:
def announce():
print("Imported!")
Mã nhập tệp ở trên, lấy cảm hứng rất nhiều từ ví dụ trong tài liệu:
import importlib.util
def module_from_file(module_name, file_path):
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
foo = module_from_file("foo", "/path/to/foo.py")
if __name__ == "__main__":
print(foo)
print(dir(foo))
foo.announce()
Đầu ra:
<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
Lưu ý rằng tên biến, tên mô-đun và tên tệp không cần phải khớp. Mã này vẫn hoạt động:
import importlib.util
def module_from_file(module_name, file_path):
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
baz = module_from_file("bar", "/path/to/foo.py")
if __name__ == "__main__":
print(baz)
print(dir(baz))
baz.announce()
Đầu ra:
<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!
Các mô-đun nhập theo lập trình đã được giới thiệu trong Python 3.1 và cung cấp cho bạn nhiều quyền kiểm soát hơn về cách các mô-đun được nhập. Tham khảo tài liệu để biết thêm thông tin.