Mencoba UV: Pengelola Paket Python (Lagi...)
Jika kita berbicara mengenai bahasa pemrograman populer yang dianggap ramah pemula, Python hampir selalu masuk dalam daftar. Struktur penulisannya yang sederhana, ekosistem yang luas, serta banyaknya tutorial yang tersedia menjadikannya pilihan yang baik bagi pemula.
Namun, meskipun Python ramah pemula, pengelolaan paketnya sering kali membingungkan, bahkan bagi yang sudah berpengalaman sekalipun. Secara default, Python memasang paket di level global, berbeda dengan JavaScript yang menggunakan node_modules
atau PHP dengan vendor
. Selain itu, jika JavaScript memiliki package.json
dan PHP memiliki composer.json
, Python menggunakan pendekatan berbeda. Tidak ada satu berkas khusus yang secara otomatis mencatat dependensi, tetapi kita bisa mencatatnya secara manual menggunakan perintah:
python -m pip freeze [options]
Perintah ini akan mencatat semua paket yang telah terpasang di sistem ke dalam sebuah berkas. Namun, karena pemasangan paket dilakukan secara global, ada kemungkinan paket yang tidak dibutuhkan ikut terbawa. Akibatnya, jika daftar ini digunakan dalam proyek lain, proyek tersebut bisa menjadi lebih besar dari yang seharusnya.
Oleh karena itu, banyak orang menyarankan penggunaan virtual environment untuk mengisolasi dependensi proyek dan menghindari masalah tersebut.
Virtual Environment
Dalam menggunakan virtual Environment (selanjutnya kita singkat venv) bisa dibilang belum memiliki cara standar dan banyak pendekatan di luar sana yang berbeda-beda. Beberapa cara populer untuk menggunakan venv
- venv bawaan python
- pipenv
- poetry
- conda
Saya sendiri baru pernah menggunakan nomor 1-3, ketiganya mempunya format yang berbeda-beda dan keunggulan masing-masing tentunya, terakhir muncul pesaing baru bernama uv
yang memiliki jualan utamanya kecepatan karena dibuat dengan bahasa Rust.
Mencoba UV
Secara singkat, UV tidak jauh berbeda dalam penggunaannya dengan Poetry maupun Pipenv. Namun, jika dibandingkan, UV memiliki keunggulan dalam kecepatan saat melakukan package resolution, yang lebih cepat dibandingkan kedua aplikasi tersebut.
Untuk menggunakan UV, kita dapat menjalankan perintah berikut:
uv init <<folder>>
cd <<folder>>
uv add <<nama paket>>
Dan isi projek uv secara awal akan seperti berikut.
├── README.md
├── hello.py
└── pyproject.toml
Menjalakan berkas python melalui uv sedikit berbeda, kita harus memulai dengan uv run <<nama berkas>>
uv run hello.py
>> Hello from projek!
Sedangkan pyproject.toml
ini setara dengan package.json
maupun composer.json
, ini contoh berkas pyproject.toml
untuk aplikasi fastapi milik saya.
name = "fapi-kit"
version = "0.1.0"
description = "Fast api rest api starter kit"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"anyio>=4.7.0",
"assertpy>=1.1",
"asyncpg>=0.30.0",
"black>=24.10.0",
"fastapi[standard]>=0.115.6",
"filelock>=3.16.1",
"freezegun>=1.5.1",
"ipdb>=0.13.13",
"isort>=5.13.2",
"loguru>=0.7.3",
"psycopg>=3.2.3",
"pyjwt>=2.10.1",
"pytest-asyncio>=0.25.0",
"pytest-mock>=3.14.0",
"pytest-xdist>=3.6.1",
"python-dotenv>=1.0.1",
"pytz>=2024.2",
"ruff>=0.8.4",
"trio>=0.28.0",
]
Di balik kemudahannya, ada beberapa hal dari UV yang mungkin terasa mengganggu.
Perintah seperti uv run <berkas>
, uv add <nama paket>
, dan uv ...
merupakan sesuatu yang baru. Terkadang, perubahan seperti ini bisa terasa kontraproduktif karena berbeda dari standar bawaan Python.
Namun, bagi saya, daya tarik UV justru bukan hanya dari pengelolaan paketnya, tetapi juga karena banyak fitur berguna, terutama untuk kebutuhan proof of concept. Berikut utilitas UV yang sering saya gunakan:
Contoh, saya memiliki berkas seperti berikut
import sys
print(sys.version)
Lalu saya jalankan dengan beberapa versi
➜ python main.py
3.13.1 (v3.13.1:06714517797, Dec 3 2024, 14:00:22) [Clang 15.0.0 (clang-1500.3.9.4)]
➜ uv run main.py
3.13.1 (main, Dec 19 2024, 14:22:59) [Clang 18.1.8 ]
➜ uv run --python 3.12 main.py
3.12.8 (main, Dec 19 2024, 14:22:58) [Clang 18.1.8 ]
Karena dapat menjalankan berbagai versi, kita bahkan bisa menguji kode dengan cepat di beberapa versi Python sekaligus.
➜ uv run --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item
test_simple_math.py . [100%]
====================================================================== 1 passed in 0.00s ======================================================================
➜ uv run --python 3.11 --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.11.11, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item
test_simple_math.py . [100%]
====================================================================== 1 passed in 0.00s ======================================================================
➜ uv run --python 3.12 --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.12.8, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item
test_simple_math.py . [100%]
====================================================================== 1 passed in 0.00s ======================================================================
➜
pastikan sebelum melakukan pengetesan seperti di atas anda memiliki konfigurasi setup.py
Referensi:

