Học bằng cách đọc theo thứ tự

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.

Bốn vùng module sys phủ
sys moduleThông tin runtimesys.pathsys.versionI/Osys.argvsys.stdoutKết thúcsys.exitThông tin Pythonsys.platform
sys xử lý thông tin runtime (path / version / platform), I/O (argv / stdout), và kết thúc tiến trình (exit) đều ở một chỗ. Thư viện như argparse cũng dựa vào sys.argv ở bên trong.
Thuộc tính / HàmKiểuÝ nghĩa
sys.pathlist[str]Danh sách folder mà import tìm module
sys.argvlist[str]Danh sách tham số dòng lệnh được truyền vào
sys.versionstrChuỗi version Python
sys.platformstrMã định danh OS ('darwin' / 'linux' / 'win32', v.v.)
sys.exit(code)functionKết thúc tiến trình với exit code đã cho
sys.stdoutTextIOĐầu ra chuẩn. Nơi print viết tới

`sys.path`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).

Lấy ra platformnội dung của module search path từ module sys và hiển thị chúng. Module sys cho bạn truy cập thông tin về tiến trình Python đang chạy.

① Hãy import module sys

② Hãy dùng sys.platform để in runtime ở dạng Platform: ◯◯

③ Hãy lặp qua sys.path với for và in từng entry trên dòng riêng (thay chuỗi rỗng '' bằng nhãn rõ hơn)

(Nếu code chạy đúng, phần giải thích sẽ xuất hiện.)

Python Editor

Chạy code để xem đầu ra

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.

Tham số dòng lệnh rơi vào sys.argv ra sao
python script.pyuser_name 42argv[0]'script.py'argv[1]'user_name'argv[2]'42'
Mỗi token trên dòng lệnh được truyền trái-sang-phải dưới dạng danh sách vào 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)
argparse xử lý tham số ra sao
sys.argv['--keyword', 'Apple','--limit', '5']ArgumentParser+ add_argumentparse_args()args object.keyword / .limitparse
ArgumentParser parse chuỗi dòng lệnh như --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:].

Xây parser tham số cho CLI tìm kiếm sản phẩm với argparse. Tạo parser nhận hai option, --keyword--limit, rồi parse danh sách tham số mô phỏng.

Trên cài Python thật, gọi parse_args() không tham số đọc từ sys.argv tự động, nhưng vì bài này chạy trên trình duyệt bạn sẽ truyền danh sách cho parse_args() thủ công thay cho sys.argv.

① Hãy import argparse và tạo parser

② Hãy đăng ký hai tham số --keyword--limit

③ Hãy parse danh sách ["--keyword", "Apple", "--limit", "5"] (vì trình duyệt không có sys.argv thật, hãy truyền danh sách trực tiếp)

④ Hãy lấy keyword và limit ra khỏi kết quả parsed và in chúng trên một dòng, cách bằng dấu cách

Python Editor

Chạy code để xem đầu ra

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ế.

OptionTác dụngVí dụ
typeChuyển chuỗi nhận được sang kiểu kháctype=int → '5' thành 5
defaultGiá trị mặc định khi tham số bị bỏ quadefault=10
requiredLàm thành bắt buộc; lỗi nếu thiếurequired=True
choicesGiới hạn về danh sách giá trị cho phépchoices=['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.

Định nghĩa các tham số cho CLI tìm kiếm tồn kho, đầy đủ chuyển kiểu, giá trị mặc định, và choices. Xác nhận bỏ --limit rơi về default.

Trên máy thật, parse_args() không tham số đọc từ sys.argv tự động, nhưng vì bạn chạy trên trình duyệt sẽ truyền danh sách tham số mô phỏng trực tiếp.

① Hãy import argparse và tạo parser

② Hãy đăng ký ba tham số này

- --keyword: bắt buộc

- --limit: kiểu integer, mặc định 10

- --order: hoặc asc hoặc desc, mặc định asc

③ Hãy parse danh sách tương đương --keyword Banana --order desc (bỏ --limit)

④ Hãy in cả ba giá trị, keyword, limit, và order, trên một dòng cách bằng dấu cách

Python Editor

Chạy code để xem đầu ra

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
Luồng kết thúc tiến trình với sys.exit
sys.exit(0)Thành côngExit code 0sys.exit(1)Thất bạiExit code 1Không gọi sys.exitChạy tới dòng cuốiExit code 0Shell dùng $?để check exit code
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.

Viết kiểm tra tồn kho với sys.exit. Khi số lượng âm nhập vào, chương trình nên thất bại và code sau đó không nên chạy.

① Hãy import sys

② Hãy đặt số lượng tồn kho thành -3 (để giả lập giá trị xấu)

③ Nếu tồn kho âm, hãy in Error: stock is negative, rồi kết thúc tiến trình với exit code 1

④ Bên ngoài if, hãy in tồn kho ở dạng Stock check OK: ◯◯ (cái này không nên chạy khi tồn kho âm)

Python Editor

Chạy code để xem đầu ra
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

Câu 1sys.path đại diện cho cái gì?

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?