Câu 1sys.path đại diện cho cái gì?
sys và argparse — Thông tin runtime và parse tham số
Học module sys và argparse của Python từ căn bản. Từ đọc thông tin runtime với sys.path / sys.argv / sys.exit đến xây parser tham số có cấu trúc với argparse — đều có thực hành.
Bài này đi qua module sys, cho bạn truy cập runtime Python, và module argparse, cấu trúc tham số dòng lệnh. Bạn sẽ phủ căn bản của sys.path / sys.argv / sys.exit, rồi chuyển sang định nghĩa tham số có chuyển kiểu, default, và choices dùng ArgumentParser của argparse.
Module sys — Đọc runtime Python
Module sys là thư viện chuẩn cho bạn truy cập thông tin về chính tiến trình Python đang chạy. Cái gì có thể import (sys.path), cái gì được truyền vào từ dòng lệnh (sys.argv), version Python và platform (sys.version / sys.platform), và cách kết thúc tiến trình (sys.exit) — thông tin và hàm về chính Python đều ở đây.
| Thuộc tính / Hàm | Kiểu | Ý nghĩa |
|---|---|---|
| sys.path | list[str] | Danh sách folder mà import tìm module |
| sys.argv | list[str] | Danh sách tham số dòng lệnh được truyền vào |
| sys.version | str | Chuỗi version Python |
| sys.platform | str | Mã định danh OS ('darwin' / 'linux' / 'win32', v.v.) |
| sys.exit(code) | function | Kết thúc tiến trình với exit code đã cho |
| sys.stdout | TextIO | Đầu ra chuẩn. Nơi print viết tới |
`sys.path` là danh sách folder mà import tìm kiếm module, quét theo thứ tự từ trên xuống. Với for p in sys.path: bạn có thể in mỗi folder đã đăng ký một dòng. Trên runtime Pyodide bạn sẽ thấy đường dẫn như /lib/python312.zip / /lib/python3.12 / /lib/python3.12/lib-dynload / /lib/python3.12/site-packages, còn cài Python thường liệt kê folder thư viện chuẩn và site-packages (nơi thư viện cài qua pip nằm).
sys.platform là thuộc tính trả về mã định danh OS dưới dạng chuỗi. Trên runtime Pyodide của trình duyệt nó hiện emscripten (trên máy thật bạn sẽ thấy darwin (Mac) / win32 (Windows) / linux). Nó được dùng khi bạn cần rẽ nhánh theo hệ điều hành.
import sys
print("Platform:", sys.platform)
# Mac: Platform: darwin
# Windows: Platform: win32
# Linux: Platform: linux
# Browser: Platform: emscripten
sys.argv và argparse — Xử lý tham số dòng lệnh
Trên cài Python thật, khi bạn chạy lệnh như python script.py user_name 42, các token rơi vào sys.argv dưới dạng danh sách chuỗi. sys.argv[0] là tên script, và sys.argv[1:] chứa tham số bạn truyền vào. Module argparse là thư viện chuẩn đọc sys.argv và chuyển nó thành đối tượng bạn truy cập qua thuộc tính, cho phép khai báo chuyển kiểu, giá trị mặc định, và giới hạn lựa chọn một cách gọn gàng.
sys.argv. Entry đầu tiên là tên script, nên tham số thực sự bắt đầu từ sys.argv[1:].# script.py (dự định chạy trên cài Python thật)
import sys
print(sys.argv)
# Ví dụ: chạy python script.py user_name 42 cho ra
# ['script.py', 'user_name', '42']
# Tham số thực sự bắt đầu từ [1:]
args = sys.argv[1:]
print(args) # ['user_name', '42']
sys.argv về cơ bản là rỗng trên trình duyệt
Runtime trình duyệt mà series này dùng không có dòng lệnh nào cả, nên sys.argv chỉ giữ giá trị cố định như ['<exec>']. Kiểm tra hành vi máy thật ở block code bên trên; trong thực hành bạn sẽ thay thế bằng cách truyền danh sách trực tiếp thay cho sys.argv.
Khi bạn bắt đầu tự tay tách `sys.argv`, bạn ngay lập tức gặp yêu cầu như chuyển chuỗi sang số, hỗ trợ flag tùy chọn, hoặc in thông điệp usage với --help. Python ship argparse như thư viện chuẩn xử lý hết những thứ này cho bạn, và luồng cơ bản là 3 bước — tạo ArgumentParser, đăng ký các tham số bạn muốn nhận với add_argument, rồi chuyển chúng thành giá trị với parse_args.
# Phong cách Python máy thật
import argparse
parser = argparse.ArgumentParser(description="CLI tìm kiếm sản phẩm")
parser.add_argument("--keyword", required=True) # truyền dưới dạng --keyword Apple
parser.add_argument("--limit", type=int, default=10) # tự động chuyển thành int
args = parser.parse_args() # đọc sys.argv[1:]
print(args.keyword, args.limit)
--keyword Apple --limit 5 thành đối tượng bạn truy cập qua thuộc tính như args.keyword / args.limit.Trên trình duyệt, dùng dạng parse_args(list)
Vì runtime trình duyệt không có sys.argv, gọi parse_args() không tham số sẽ ném lỗi. Dùng cùng dạng truyền danh sách bạn dùng trong test — parse_args(["--keyword", "Apple", "--limit", "5"]). Trên máy thật, bỏ danh sách đó tự động dùng sys.argv[1:].
argparse Sâu hơn — Chuyển kiểu, Default, Choices
add_argument có vài option kiểm soát hành vi của tham số. Bốn option phủ gần hết các trường hợp CLI thực tế.
| Option | Tác dụng | Ví dụ |
|---|---|---|
| type | Chuyển chuỗi nhận được sang kiểu khác | type=int → '5' thành 5 |
| default | Giá trị mặc định khi tham số bị bỏ qua | default=10 |
| required | Làm thành bắt buộc; lỗi nếu thiếu | required=True |
| choices | Giới hạn về danh sách giá trị cho phép | choices=['asc', 'desc'] |
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--keyword", required=True)
parser.add_argument("--limit", type=int, default=10)
parser.add_argument("--order", choices=["asc", "desc"], default="asc")
args = parser.parse_args(["--keyword", "Apple", "--limit", "5", "--order", "desc"])
print(args.keyword, args.limit, args.order)
# -> Apple 5 desc
Kết hợp type và default
Khi bạn chỉ định cả type=int, default=10, tham số nhận 10 (int) khi bỏ qua, và giá trị truyền vào được chuyển sang int khi cấp. Giá trị default không qua chuyển kiểu, nên hãy viết default sẵn ở kiểu đích. Viết default="10" sẽ đặt chuỗi "10" vào chỉ khi tham số bị bỏ qua — bug tinh vi.
sys.exit — Trả về Exit Code
sys.exit(code) là hàm nhận một số và kết thúc tiến trình. Theo quy ước, 0 nghĩa là thành công và bất kỳ giá trị khác 0 nào (thường là 1) nghĩa là thất bại, và hệ thống CI cùng shell script rẽ nhánh dựa trên giá trị này để quyết định việc tiếp theo. Bên trong, nó raise một exception SystemExit. Bạn có thể bắt nó với try / except, nhưng thường để nó propagate để tiến trình kết thúc.
import sys
price = -100
if price < 0:
print("Error: price is negative")
sys.exit(1) # không gì sau điểm này chạy
print("Continuing...") # chỉ chạy khi price >= 0
sys.exit(0) báo thành công và sys.exit(1) báo thất bại cho bên gọi (shell hoặc CI). Trên máy thật bạn có thể kiểm tra exit code với $? trong shell. Nếu bạn không gọi sys.exit, script chạy tới dòng cuối.Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Cái nào mô tả tốt nhất sys.exit(1)?
Câu 3Khi bạn muốn thử argparse trên trình duyệt, cách nào bạn dùng được thay cho sys.argv?