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

| | Python
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

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 -h dan --help, plus pesan error yang rapi kalau argumen salah
  • cukup untuk 90% tool internal, kalau butuh warna-warni atau prompt interaktif baru lirik Typer atau Click

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=Path dari pathlib biar langsung dapat Path object, tidak perlu os.path manual.

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 todo tidak dikenal setelah install, cek Scripts sudah masuk PATH atau belum. biasanya ada di %APPDATA%\Python\Scripts atau .venv\Scripts kalau 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 parsing sys.argv manual
  • posisi untuk wajib, flag -- untuk opsional dengan default
  • type, choices, required, nargs untuk validasi biar error-nya rapi
  • subcommand pakai add_subparsers(required=True) untuk tool seperti todo add atau todo list
  • pola set_defaults(func=...) bikin routing subcommand rapi tanpa if panjang
  • biar bisa dipanggil global, tambah [project.scripts] di pyproject.toml lalu pip 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.

Sigit Nurhanafi avatar
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.