Belajar Python CLI dengan Argparse: Bikin Tool Command Line Lengkap 2026

membuat tool CLI sendiri adalah salah satu cara paling memuaskan memakai Python, dan argparse adalah modul bawaan yang membuatnya mudah ๐. saya sering membuat script kecil untuk tugas berulang, lalu menambahkannya ke menu CLI agar bisa dipakai dengan parameter yang berbeda.
jika kalian sudah pernah main sys.argv manual atau baca module dan package dan file handling, maka argparse akan terasa seperti upgrade yang paling masuk akal. tidak perlu install apa pun, cukup import argparse.
Daftar Isi
- 1. Kenapa argparse di 2026 masih jadi default
- 2. Argumen posisi yang wajib
- 3. Flag opsional yang fleksibel
- 4. Tipe, choices, dan validasi
- 5. Subcommand untuk tool beneran
- 6. Studi kasus: Todo CLI dengan file JSON
- 7. Biar bisa dipanggil todo dari mana saja
1. Kenapa Argparse di 2026 Masih Jadi Default
jika kalian cari python cli di 2026, maka akan muncul argparse, Click, Typer, sampai cyclopts. tapi argparse tetap yang pertama saya ajarkan:
- bawaan Python, tidak perlu
pip install, jadi script bisa jalan di server mana pun - otomatis bikin
-hdan--help, plus pesan error yang rapi kalau argumen salah - cukup untuk 90% tool internal, kalau butuh warna-warni atau prompt interaktif baru lirik
TyperatauClick
di Python 3.12 ke atas, argparse sudah support required=True di add_subparsers dengan lebih konsisten, dan BooleanOptionalAction untuk flag --no-verbose. jadi kalau lihat tutorial lama yang masih pakai trik manual untuk --no-, sekarang sudah ada bawaan.
2. Argumen Posisi yang Wajib
jika script cuma butuh satu input, maka argumen posisi adalah yang paling simpel:
import argparse
parser = argparse.ArgumentParser(description="Greet tool")
parser.add_argument("name", help="Nama yang akan disapa")
args = parser.parse_args()
print(f"Halo {args.name}!")
jalankan:
python greet.py Andi
# Halo Andi!
python greet.py -h
# usage: greet.py [-h] name
# name Nama yang akan disapa
name tanpa - berarti wajib. kalau tidak diisi, argparse langsung kasih error dan tunjukkan usage, tanpa kita tulis if manual.
butuh dua posisi:
parser.add_argument("src", help="File sumber")
parser.add_argument("dst", help="File tujuan")
# pakai: python copy.py a.txt b.txt
3. Flag Opsional yang Fleksibel
jika argumen tidak wajib dan punya default, maka pakai flag dengan --:
import argparse
parser = argparse.ArgumentParser(description="Greet dengan flag")
parser.add_argument("name", help="Nama")
parser.add_argument("--greeting", "-g", default="Halo", help="Sapaan (default: Halo)")
parser.add_argument("--count", "-c", type=int, default=1, help="Berapa kali cetak")
parser.add_argument("--verbose", "-v", action="store_true", help="Tampilkan detail")
args = parser.parse_args()
for i in range(args.count):
if args.verbose:
print(f"[{i+1}] {args.greeting} {args.name}!")
else:
print(f"{args.greeting} {args.name}!")
coba:
python greet.py Andi
# Halo Andi!
python greet.py Andi -g Hai -c 3
# Hai Andi! (3x)
python greet.py Andi --greeting Pagi --verbose
# [1] Pagi Andi!
beberapa pola yang sering kepakai di 2026:
# flag boolean kebalikan, butuh Python 3.9+
parser.add_argument("--verbose", action=argparse.BooleanOptionalAction, default=False)
# bisa --verbose dan --no-verbose
# flag yang bisa ditulis banyak kali: -vvv
parser.add_argument("-v", "--verbose", action="count", default=0)
# -v = 1, -vv = 2
# flag wajib walau pakai --
parser.add_argument("--output", "-o", required=True, help="File output wajib diisi")
# nargs untuk banyak value
parser.add_argument("--files", nargs="+", help="Banyak file")
# --files a.txt b.txt c.txt
tip saya: untuk flag file atau folder, pakai
type=Pathdaripathlibbiar langsung dapatPathobject, tidak perluos.pathmanual.
4. Tipe, Choices, dan Validasi
jika input harus angka atau pilihan tertentu, maka jangan validasi manual, serahkan ke argparse:
import argparse
from pathlib import Path
def cek_positif(val):
n = int(val)
if n <= 0:
raise argparse.ArgumentTypeError("harus > 0")
return n
parser = argparse.ArgumentParser()
parser.add_argument("--count", type=cek_positif, default=1, help="Harus angka positif")
parser.add_argument("--mode", choices=["fast", "slow"], default="fast", help="Pilih mode")
parser.add_argument("--output", type=Path, help="Path file output")
args = parser.parse_args()
print(args)
coba errornya:
python app.py --mode cepat
# error: argument --mode: invalid choice: 'cepat' (choose from 'fast', 'slow')
python app.py --count -5
# error: argument --count: harus > 0
type bisa fungsi apa pun yang terima string dan return value, kalau raise ArgumentTypeError maka pesan errornya otomatis rapi. choices cocok untuk menu terbatas seperti dev atau prod.
5. Subcommand untuk Tool Beneran
jika tool punya banyak perintah seperti git add atau todo list, maka pakai subcommand:
import argparse
parser = argparse.ArgumentParser(prog="todo", description="Todo CLI sederhana")
sub = parser.add_subparsers(dest="cmd", required=True, help="Perintah")
# todo add "belajar argparse"
add = sub.add_parser("add", help="Tambah task")
add.add_argument("task", help="Isi task")
# todo done 1
done = sub.add_parser("done", help="Tandai selesai")
done.add_argument("id", type=int, help="Nomor task")
# todo list
sub.add_parser("list", help="Lihat semua task")
# todo clean --force
clean = sub.add_parser("clean", help="Hapus yang sudah selesai")
clean.add_argument("--force", action="store_true", help="Tanpa konfirmasi")
args = parser.parse_args()
print(args)
required=True di add_subparsers itu penting di Python 3.12, biar kalau tidak ada subcommand langsung error, bukan diam saja. tiap sub parser bisa punya flag sendiri, jadi todo add dan todo clean --force tidak bentrok.
6. Studi Kasus: Todo CLI dengan File JSON
jika semua di atas digabung, maka jadinya Todo CLI yang bisa dipakai harian. ini versi yang sudah saya rapikan dari draft awal, ada simpan ke tasks.json dan handle error yang enak:
import argparse
import json
import os
from pathlib import Path
TODO_FILE = Path("tasks.json")
def load():
if TODO_FILE.exists():
try:
return json.loads(TODO_FILE.read_text(encoding="utf-8"))
except json.JSONDecodeError:
print("tasks.json rusak, mulai dari kosong")
return []
return []
def save(tasks):
TODO_FILE.write_text(json.dumps(tasks, ensure_ascii=False, indent=2), encoding="utf-8")
def cmd_add(args):
tasks = load()
tasks.append({"task": args.task, "done": False})
save(tasks)
print(f"Added: {args.task}")
def cmd_list(args):
tasks = load()
if not tasks:
print("belum ada task, tambah dengan: todo add \"belajar\"")
return
for i, t in enumerate(tasks, 1):
s = "โ" if t["done"] else "โ"
print(f"{i}. {s} {t['task']}")
def cmd_done(args):
tasks = load()
if 0 < args.id <= len(tasks):
tasks[args.id - 1]["done"] = True
save(tasks)
print(f"Task {args.id} selesai!")
else:
print(f"id {args.id} tidak ada")
exit(1)
def cmd_clean(args):
tasks = load()
sisa = [t for t in tasks if not t["done"]]
if not args.force:
hapus = len(tasks) - len(sisa)
if hapus == 0:
print("tidak ada yang perlu dibersihkan")
return
ans = input(f"hapus {hapus} task selesai? [y/N] ")
if ans.lower() != "y":
print("batal")
return
save(sisa)
print(f"dibersihkan {len(tasks) - len(sisa)} task")
parser = argparse.ArgumentParser(prog="todo", description="Todo CLI dengan argparse")
sub = parser.add_subparsers(dest="cmd", required=True)
p_add = sub.add_parser("add", help="Tambah task")
p_add.add_argument("task", help="Isi task")
p_add.set_defaults(func=cmd_add)
p_list = sub.add_parser("list", help="Lihat task")
p_list.set_defaults(func=cmd_list)
p_done = sub.add_parser("done", help="Tandai selesai")
p_done.add_argument("id", type=int, help="Nomor task")
p_done.set_defaults(func=cmd_done)
p_clean = sub.add_parser("clean", help="Hapus yang selesai")
p_clean.add_argument("--force", action="store_true", help="Tanpa konfirmasi")
p_clean.set_defaults(func=cmd_clean)
args = parser.parse_args()
args.func(args)
cara pakai:
python todo.py add "belajar argparse"
python todo.py add "buat laporan"
python todo.py list
# 1. โ belajar argparse
# 2. โ buat laporan
python todo.py done 1
python todo.py list
# 1. โ belajar argparse
python todo.py clean
python todo.py clean --force
pola set_defaults(func=...) di atas bikin if args.cmd == ... tidak perlu, tinggal args.func(args), lebih rapi kalau subcommand sudah banyak.
jika mau simpan ke SQLite biar bisa query, tinggal ganti load dan save pakai pola di SQLite, sisa argparse-nya tetap sama.
7. Biar Bisa Dipanggil todo dari Mana Saja
jika script sudah enak dipakai, maka langkah terakhir adalah bikin bisa dipanggil langsung todo tanpa python todo.py:
buat struktur project:
todo-cli/
pyproject.toml
todo.py
tasks.json
isi pyproject.toml minimal:
[project]
name = "todo-cli"
version = "0.1.0"
description = "Todo CLI dengan argparse"
requires-python = ">=3.9"
[project.scripts]
todo = "todo:main"
# format: perintah = "file:fungsi"
di todo.py bungkus parser dalam main():
def main():
args = parser.parse_args()
args.func(args)
if __name__ == "__main__":
main()
lalu install:
pip install -e .
# atau kalau pakai pipx/uv
# uv pip install -e .
todo add "coba"
todo list
pip install -e . pasang dalam mode edit, jadi tiap ubah todo.py langsung kepakai tanpa install ulang. kalau mau distribusi, tinggal pip install build && python -m build lalu upload ke PyPI, atau cukup share folder dan suruh pip install -e ..
di Windows, kalau
todotidak dikenal setelah install, cekScriptssudah masukPATHatau belum. biasanya ada di%APPDATA%\Python\Scriptsatau.venv\Scriptskalau pakai venv seperti di pip dan venv.
alternatif modern 2026 kalau butuh yang lebih cakep adalah Typer yang berbasis Click dan pakai type hints, tapi untuk tool internal yang butuh cepat jadi tanpa dependensi, argparse tetap pilihan pertama saya.
Kesimpulan
- argparse itu bawaan, otomatis ada
-h, tidak perlu parsingsys.argvmanual - posisi untuk wajib, flag
--untuk opsional dengandefault - type, choices, required, nargs untuk validasi biar error-nya rapi
- subcommand pakai
add_subparsers(required=True)untuk tool sepertitodo addatautodo list - pola
set_defaults(func=...)bikin routing subcommand rapi tanpaifpanjang - biar bisa dipanggil global, tambah
[project.scripts]dipyproject.tomllalupip install -e .
habis ini kalian bisa kembangkan Todo CLI di atas dengan tambah subcommand edit atau search, atau sambungkan ke file biar data tidak hilang seperti di file handling.
Baca Juga Mengenai :
Pertanyaan yang Sering Diajukan
Apa itu argparse di Python?
argparse adalah modul bawaan Python untuk bikin aplikasi command line. dia urus parsing argumen, generate help -h otomatis, dan validasi tipe, jadi tidak perlu parsing sys.argv manual.
Apa beda argumen posisi dan opsional?
argumen posisi wajib diisi tanpa nama flag, contoh greet Andi. argumen opsional pakai --nama seperti --greeting Halo, biasanya punya default dan prefix --.
Bagaimana bikin flag boolean seperti --verbose?
pakai action="store_true" di add_argument. kalau flag ditulis, nilainya True, kalau tidak ditulis False. tidak perlu kasih value.
Apa itu subcommand di argparse?
subcommand itu perintah turunan seperti git add atau todo add. dibuat dengan add_subparsers, tiap subcommand punya argumen sendiri.
Bagaimana validasi input di argparse?
pakai type=int atau type=Path, choices untuk pilihan terbatas, dan required=True untuk flag wajib. untuk validasi kompleks, pakai fungsi custom di type.
Apakah argparse masih relevan dibanding Click atau Typer?
masih, karena bawaan dan tanpa dependensi. untuk tool internal dan script automasi, argparse paling cepat. Click dan Typer baru enak kalau butuh warna, prompt interaktif, atau nested command banyak.
Bagaimana bikin CLI bisa dipanggil langsung seperti todo?
tambahkan entry_points di pyproject.toml atau setup.py console_scripts, lalu pip install -e . . setelah itu perintah todo bisa dipanggil dari mana saja.

