Menu

Module và import trong Python: import, from-import, pip, package

Cách hệ thống module của Python hoạt động: tự viết module, import từ module đó và dùng pip để cài package bên thứ ba.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

Một tệp là một module

Khi code Python lớn hơn một script đơn lẻ, bạn sẽ muốn chia nó ra nhiều tệp. Hệ thống module của Python rất đơn giản: tệp .py nào cũng tự động là một module, import được theo tên.

Giả sử bạn có tệp util.py:

# util.py
def greet(name):
    return f"Hello, {name}"

PI = 3.14159

Từ một tệp khác trong cùng thư mục, main.py, bạn có thể dùng nó:

# main.py
import util

print(util.greet("Ada"))
print(util.PI)

Chạy python3 main.py, Python sẽ tìm util.py, chạy nó một lần và đưa mọi thứ định nghĩa ở cấp cao nhất (hàm, biến, lớp) thành thuộc tính của module util.

Ba dạng import

Import cả module. Những thứ bên trong được truy cập qua tên module:

Import những tên cụ thể. Chúng dùng được trực tiếp:

Import với alias. Hữu ích khi tên module dài hoặc khi hai module trùng tên:

import numpy as np
import pandas as pd

# Now use np.array(...), pd.DataFrame(...), etc.

Còn dạng thứ tư, from math import *, kéo mọi thứ vào namespace của bạn. Tránh dùng nó ngoài lúc thử nghiệm trong REPL: nó khiến bạn không biết một tên đến từ đâu và gây xung đột tên một cách âm thầm.

Khi nào import được chạy

Python thực thi code cấp cao nhất của module được import đúng một lần, vào lần đầu module đó được import trong chương trình. Những lần import sau trả về phiên bản đã được nạp. Vì vậy đoạn này:

# setup.py
print("setup module loading...")
VALUE = 42
# main.py
import setup
import setup  # imported twice - but "loading" only prints once
print(setup.VALUE)

Chỉ in ra "setup module loading..." một lần. Điều này quan trọng: nếu bạn đặt tác dụng phụ (như mở tệp hay in ra màn hình) ở cấp cao nhất của module, chúng sẽ xảy ra lúc import, thường không phải điều bạn muốn. Hãy đặt chúng vào trong hàm.

Thư viện chuẩn

Python đi kèm một thư viện chuẩn lớn gồm nhiều module. Bạn đã gặp vài cái. Một số bạn sẽ dùng liên tục:

  • math: sqrt, sin, log, các hằng số như pi và e.
  • random: số ngẫu nhiên, chọn ngẫu nhiên, xáo trộn.
  • datetime: ngày và giờ.
  • json: đọc/ghi JSON.
  • os, os.path: đường dẫn và thao tác với hệ thống tệp.
  • pathlib: xử lý đường dẫn kiểu hiện đại, thường dễ chịu hơn os.path.
  • re: biểu thức chính quy.
  • collections: các kiểu tập hợp chuyên dụng (Counter, defaultdict, deque, v.v.).
  • itertools, functools: công cụ hỗ trợ cho iterator và hàm.
  • csv: đọc và ghi tệp CSV.

Thư viện chuẩn đã được cài sẵn, không cần pip install gì cả.

Package bên thứ ba và pip

Với những gì thư viện chuẩn không có, Python Package Index (PyPI) chứa hàng trăm nghìn package. Cài chúng bằng pip:

pip install requests
pip install pandas
pip install --upgrade requests
pip uninstall requests

Sau khi cài, bạn import chúng như mọi thứ khác:

import requests

response = requests.get("https://api.example.com/data")
print(response.status_code)

Vài mẹo để quản lý việc này cho gọn gàng:

Dùng môi trường ảo

Cài mọi thứ ở mức toàn cục sẽ gây đau đầu. Mỗi dự án cần phiên bản khác nhau; có package phụ thuộc vào phiên bản Python cụ thể; trên một số hệ thống, cài toàn cục cần quyền quản trị. Môi trường ảo (virtual environment) là một bản cài Python tách biệt, chỉ dành cho một dự án:

python3 -m venv .venv
source .venv/bin/activate    # macOS/Linux
.venv\Scripts\activate       # Windows

pip install requests

Khi venv đang được kích hoạt, pip cài vào thư mục dự án chứ không vào hệ thống. Dùng xong thì tắt bằng deactivate.

Ghim phiên bản phụ thuộc

Lưu danh sách package đã cài để người khác (kể cả chính bạn sau này) có thể tạo lại đúng môi trường đó:

pip freeze > requirements.txt

Sau đó:

pip install -r requirements.txt

Các công cụ như Poetry, pipenv và uv làm việc này tiện hơn, nhưng quy trình pip + requirements.txt đơn giản vẫn ổn khi đang học.

Tự viết module

Khi có những hàm muốn dùng lại ở nhiều tệp, hãy đặt chúng vào module riêng. Quy ước đặt tên:

  • Tên tệp nên là lower_snake_case.py.
  • Hàm và biến ở cấp module cũng dùng lower_snake_case.
  • Lớp dùng PascalCase.
# shopping.py
PRICES = {"apple": 0.50, "bread": 2.00}

def total(items):
    return sum(PRICES[item] for item in items)
# main.py
from shopping import total, PRICES

print(total(["apple", "bread"]))
print(PRICES)

Nếu hai tệp trong cùng thư mục import lẫn nhau, bạn có thể vô tình tạo ra circular import (import vòng). Cách sửa thường gặp là chuyển phần code dùng chung sang một tệp thứ ba mà cả hai cùng import.

Package: thư mục chứa module

Khi có nhiều hơn vài module, hãy gom chúng thành một package, tức một thư mục có tệp __init__.py bên trong:

myproject/
├── main.py
└── utils/
    ├── __init__.py
    ├── text.py
    └── numbers.py

Rồi:

from utils.text import slugify
from utils import numbers

print(slugify("Hello, World"))
print(numbers.mean([1, 2, 3]))

__init__.py có thể để trống; chính sự có mặt của nó khiến utils thành một package. Python hiện đại cũng hỗ trợ "namespace package" không cần __init__.py, nhưng khi mới bắt đầu, phiên bản tường minh dễ hiểu hơn.

Danh sách kiểm tra nhanh khi import bị lỗi

  • "ModuleNotFoundError: No module named X". Hoặc package chưa được cài, hoặc bạn đang chạy Python bằng một trình thông dịch khác với trình thông dịch bạn đã dùng để pip install. Nếu dùng venv, nhớ kích hoạt venv trước.
  • "ImportError: cannot import name Y from X". Module tồn tại, nhưng tên bạn yêu cầu không có trong đó. Kiểm tra lỗi chính tả và xem module thực sự chứa gì.
  • "Circular import". Hai module import lẫn nhau. Chuyển phần code dùng chung sang module thứ ba.

Tiếp theo: cài package bên thứ ba

Module tự viết giúp bạn đi được khá xa, nhưng phần lớn dự án thực tế còn dùng thư viện từ PyPI: requests, pandas, một framework kiểm thử. Trang tiếp theo nói về pip, cách cài package gọn gàng và cách ghi lại những gì dự án của bạn phụ thuộc vào.

Câu hỏi thường gặp

Module trong Python là gì?

Module là bất kỳ tệp .py nào. Tệp Python tự động trở thành module, và bạn import nó theo tên (không có đuôi .py). Thư viện chuẩn là một bộ sưu tập lớn các module có sẵn như math, json và datetime, đi kèm mọi bản cài Python.

import X và from X import Y khác nhau thế nào?

import X import cả module, và bạn truy cập những thứ bên trong bằng X.something. from X import Y chỉ kéo Y vào namespace của bạn để dùng trực tiếp là Y. Cách thứ nhất an toàn hơn (không xung đột tên); cách thứ hai gọn hơn.

Làm sao để cài một package Python?

Chạy pip install package_name trong terminal. pip là trình quản lý package của Python và có sẵn trong các bản cài đặt hiện đại. Để tách biệt từng dự án, hãy tạo môi trường ảo trước để các package đã cài không lẫn giữa các dự án.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu