Import Module trong Python
Để sử dụng chức năng có trong bất kỳ module nào, bạn phải import nó vào chương trình hiện tại. Bạn cần dùng từ khóa import kèm tên module mong muốn. Khi trình thông dịch gặp câu lệnh import, nó sẽ import module vào chương trình của bạn.
Bạn có thể dùng các hàm bên trong module bằng cách sử dụng toán tử chấm (.) kèm tên module.
Trước hết, hãy xem cách dùng module trong thư viện chuẩn. Ở ví dụ dưới đây, module math được import vào chương trình để bạn có thể dùng hàm sqrt().
import math # Import the math module
num = 4
print(math.sqrt(num)) # Call the sqrt() function from the math module
Vì lý do hiệu năng, mỗi module chỉ được import một lần trong mỗi phiên làm việc của trình thông dịch. Do đó, nếu bạn thay đổi module của mình, bạn phải khởi động lại trình thông dịch.
Nếu bạn muốn nạp lại một module đã import (ví dụ sau khi chỉnh sửa), hãy dùng importlib.reload().
Lưu ý rằng hàm dựng sẵn cũ reload() không còn tồn tại trong Python 3 — importlib.reload() là cách hiện tại và chính thức để nạp lại module trong Python 3.4+
import importlib
importlib.reload(module_name)
Lưu ý: Không khuyến nghị nạp lại sys, __main__, builtins và các module then chốt khác. Nhiều module mở rộng không được thiết kế để khởi tạo nhiều hơn một lần và có thể gặp lỗi khó lường khi nạp lại. Chỉ nên nạp lại module của chính bạn trong quá trình phát triển.
Sắp ra mắt: Python đang giới thiệu "lazy imports". Tính năng này sẽ tăng tốc thời gian khởi động bằng cách hoãn tải module cho đến lần đầu tiên chúng được sử dụng. Điều này hữu ích vì, đặc biệt trong các dự án lớn, nhiều module được import ở đầu tệp nhưng chưa cần dùng ngay.
Cách Tự Viết Python Module
Giờ bạn đã biết cách import một module vào chương trình, đến lúc viết module của riêng bạn và dùng nó trong chương trình khác. Viết module cũng như viết bất kỳ tệp Python nào. Hãy bắt đầu bằng cách viết một hàm cộng/trừ hai số trong tệp calculation.py.
def add(x,y):
return (x+y)
def sub(x,y):
return (x-y)
Nếu bạn thử thực thi script này trên dòng lệnh, sẽ không có gì xảy ra vì bạn chưa chỉ dẫn chương trình làm gì. Hãy tạo một script Python khác trong cùng thư mục với tên module_test.py và viết đoạn mã sau vào đó.
import calculation #Importing calculation module
print(calculation.add(1,2)) #Calling function defined in the calculation module
Nếu bạn chạy module_test.py, bạn sẽ thấy kết quả "3". Khi trình thông dịch gặp câu lệnh import, nó đã import module calculation vào mã của bạn và nhờ toán tử chấm, bạn có thể truy cập hàm add().
Bảo vệ mã có thể chạy bằng if __name__ == "main__"
Có một thói quen quan trọng khi viết module: bao bọc mọi mã bạn chỉ muốn chạy trực tiếp (không chạy khi được import) trong phần kiểm tra if __name__ == "__main__".
# calculation.py
def add(x, y):
return x + y
def sub(x, y):
return x - y
if __name__ == "__main__":
# This only runs when you execute calculation.py directly
# It will NOT run when another script imports this module
print(add(1, 2))
__name__ của nó thành "__main__". Khi nó được import bởi script khác, __name__ sẽ là tên tệp của module. Điều này có nghĩa câu lệnh print ở trên sẽ không chạy ngoài ý muốn khi ai đó import calculation vào chương trình của họ.Các Cách Import Module Khác trong Python
Có thêm một số cách để import module:
-
Câu lệnh
from .. import -
Câu lệnh
from .. import * -
đổi tên module được import
Dùng from module import name
Câu lệnh from..import cho phép bạn import các hàm/biến cụ thể từ một module thay vì import mọi thứ. Ở ví dụ trước, khi bạn import calculation vào module_test.py, cả hai hàm add() và sub() đều được import. Nhưng nếu bạn chỉ cần hàm add() trong mã của mình thì sao? Đây là ví dụ minh họa cách dùng from..import.
from calculation import add
print(add(1,2))
Trong ví dụ trên, chỉ hàm add() được import và sử dụng. Bạn để ý việc dùng add() chứ? Giờ bạn có thể truy cập trực tiếp mà không cần tên module. Bạn cũng có thể import nhiều thuộc tính, ngăn cách bằng dấu phẩy trong câu lệnh import. Xem ví dụ sau:
from calculation import add,sub
Dùng from module import *
Bạn có thể import mọi thuộc tính của một module bằng câu lệnh này. Nó sẽ khiến tất cả thuộc tính của module được import hiển thị trong mã của bạn.
Đây là ví dụ minh họa cách dùng from .. import *:
from calculation import *
print(add(1,2))
print(sub(3,2))
Lưu ý rằng trong môi trường chuyên nghiệp, bạn nên tránh dùng from..import và from..import*. Cách này làm ô nhiễm namespace của bạn với mọi tên từ module đó, khiến việc đọc mã không biết một hàm đến từ đâu, và có thể âm thầm ghi đè các tên bạn đã định nghĩa. Hãy dùng import tường minh.
Đổi Tên Module trong Python
Bạn có thể đổi tên module đang import, hữu ích khi bạn muốn đặt tên có ý nghĩa hơn hoặc tên module quá dài để dùng lặp lại. Bạn có thể dùng từ khóa as để đổi tên. Ví dụ sau minh họa cách dùng trong chương trình.
import calculation as cal
print(cal.add(1,2))
Bạn đã tiết kiệm được một chút gõ phím bằng cách đổi calculation thành cal.
Lưu ý rằng giờ bạn không thể dùng calculation.add(1,2) nữa, vì calculation không còn được nhận diện trong chương trình. Điều gì đang xảy ra: Khi bạn đặt bí danh cho module bằng as, tên gốc không còn khả dụng trong script đó.
Đường Dẫn Tìm Module trong Python
Bạn có thể cần dùng module của mình trong các chương trình hay dự án khác nhau và vị trí vật lý của chúng trong thư mục có thể khác nhau. Nếu muốn dùng module nằm ở thư mục khác, Python cung cấp cho bạn vài lựa chọn.
Khi bạn import một module tên calculation, trình thông dịch trước tiên sẽ tìm một module tích hợp có tên đó. Nếu không thấy, nó sẽ tìm tệp tên calculation.py trong danh sách thư mục do biến sys.path cung cấp. sys.path chứa các vị trí sau:
-
Thư mục chứa script đầu vào (hoặc thư mục hiện tại)
-
PYTHONPATH(danh sách tên thư mục có cú pháp giống biến shellPATH) -
Giá trị mặc định phụ thuộc cài đặt
Giả sử module_test.py nằm trong thư mục /home/datacamp/, và bạn đã chuyển calculation.py sang /home/test/. Bạn có thể chỉnh sys.path để thêm /home/test/ vào danh sách đường dẫn mà trình thông dịch Python sẽ tìm module. Để làm vậy, bạn cần sửa module_test.py như sau:
import sys
sys.path.append('/home/test/')
import calculation
print(calculation.add(1,2))
Tệp Biên Dịch Bytecode trong Python
Import một module làm tăng thời gian thực thi chương trình, nên Python có vài mẹo để tăng tốc. Một cách là tạo các tệp biên dịch bytecode với phần mở rộng .pyc.
Nội bộ, Python chuyển mã nguồn thành dạng trung gian gọi là bytecode. Sau đó nó dịch bytecode sang ngôn ngữ gốc của máy và chạy. Tệp .pyc này hữu ích khi bạn import module lần sau từ một chương trình khác — sẽ nhanh hơn nhiều vì một phần xử lý cần thiết khi import đã được thực hiện. Ngoài ra, các tệp bytecode này độc lập nền tảng.
Lưu ý rằng các tệp .pyc thường được tạo cùng thư mục với tệp .py tương ứng. Nếu Python không có quyền ghi vào thư mục đó, thì tệp .pyc sẽ không được tạo. Các tệp này thường được lưu trong thư mục __pycache__ cạnh các tệp .py của bạn, với tên như calculation.cpython-312.pyc phản ánh phiên bản Python được dùng. Bạn có thể bỏ qua hoặc thêm thư mục này vào .gitignore. Python tự động quản lý nó.
Hàm dir() trong Python
Hàm dir() dùng để liệt kê tất cả các tên được định nghĩa trong một module. Nó trả về danh sách đã sắp xếp gồm các chuỗi là các tên được định nghĩa trong module.
import calculation
print(calculation.add(1,2))
print(dir(calculation))
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'sub']
Trong kết quả, bạn có thể thấy tên các hàm bạn đã định nghĩa trong module, add & sub. Thuộc tính __name__ chứa tên của module. Mọi thuộc tính bắt đầu bằng dấu gạch dưới là các thuộc tính mặc định của Python gắn với một module.
Kết luận
Tạo module là cần thiết để quản lý mã tốt hơn và tái sử dụng. Python cung cấp cho bạn một số module tích hợp, có thể import bằng từ khóa import. Python cũng cho phép bạn tạo module của riêng mình và dùng trong chương trình. Nó cung cấp các tệp bytecode để giảm chi phí khi dùng module, giúp thực thi nhanh hơn. Bạn có thể dùng dir() để biết các thuộc tính được định nghĩa trong module đang dùng trong chương trình. Điều này áp dụng cho cả module dựng sẵn lẫn module do người dùng tạo.
Nếu bạn muốn tìm hiểu thêm về Python, hãy xem khóa học Python Trung cấp cho Khoa học Dữ liệu của chúng tôi.
Tác giả
Nishant Kumar
Câu hỏi thường gặp
Tôi có thể import một module bên trong hàm không?
Có. Bạn có thể import module bên trong hàm, nhưng thường tốt nhất là import ở đầu tệp để rõ ràng và hiệu năng tốt hơn.
Điều gì xảy ra nếu hai module có cùng tên?
Python sẽ import kết quả khớp đầu tiên nó tìm thấy trong đường dẫn tìm module (sys.path). Hãy cẩn thận với cách đặt tên để tránh xung đột.
Tôi có cần tự biên dịch module thành .pyc không?
Không. Python tự động tạo tệp .pyc khi bạn import một module — nếu có quyền ghi.
Làm sao kiểm tra một module được import từ đâu?
Có ổn không nếu dùng from module import *?
Có hoạt động nhưng không khuyến nghị trong mã sản xuất. Nó có thể làm ô nhiễm namespace và khiến khó theo dõi những gì đang được dùng.
Khi mới học Python, bạn thường viết mọi thứ trong một tệp. Cách này ổn với các script nhỏ, nhưng khi chương trình lớn dần, một tệp duy nhất sẽ khó đọc, khó bảo trì và không thể tái sử dụng giữa các dự án. Giải pháp Python đưa ra là module.
Trong hướng dẫn này, bạn sẽ học module là gì, cách import chúng, cách tự viết module, và các thực tiễn tốt giúp phân biệt giữa script của người mới và mã sẵn sàng cho sản xuất. Trước khi bắt đầu viết module của riêng mình, tôi khuyến nghị bạn xem khóa học Giới thiệu Python cho Khoa học Dữ liệu của chúng tôi.
Python Modules là gì?
Module đơn giản là một tệp Python. Bất kỳ tệp nào có phần mở rộng
.pychứa mã Python — hàm, lớp, biến, hoặc logic có thể chạy — đều là một module. Khi bạn lưu tệp têncalculation.py, bạn đã tạo ra một module tên làcalculation.Sức mạnh của module đến từ khả năng import chúng vào các chương trình khác. Thay vì sao chép-dán cùng một hàm qua nhiều script, bạn định nghĩa một lần trong module và import khi cần. Thư viện chuẩn của Python hoạt động chính xác như vậy: các bộ sưu tập module dựng sẵn như
math,osvàrandommà bạn có thể dùng trong bất kỳ chương trình nào chỉ với một dòng.Cụ thể hơn, bạn sẽ gặp ba loại module trong Python:
Module tích hợp: đi kèm cùng Python, như
mathvàosnhư vừa đề cập.Module bên thứ ba: cài đặt qua
pip, nhưnumpyhoặcpandas.Module của chính bạn: bất kỳ tệp
.pynào do bạn viết.