- Dengan uv, manajemen dependensi saat menjalankan skrip Python diotomatisasi
- Tanpa perlu mengelola virtual environment secara terpisah, lingkungan untuk tiap skrip dibuat dan dipelihara otomatis
- Paket yang dibutuhkan dapat dideklarasikan dengan berbagai cara seperti inline metadata atau opsi baris perintah
- Versi Python dan manajemen paket juga dapat dideklarasikan per skrip serta disesuaikan secara otomatis
- Dengan file lock dan opsi pembatasan versi dependensi, reproduktibilitas dan kemudahan pemeliharaan meningkat
Gambaran umum
- uv adalah alat yang secara otomatis mengelola dependensi paket yang dibutuhkan sebuah skrip Python saat dijalankan
- Pengguna tidak perlu lagi secara manual membuat virtual environment atau memasang paket
- Alat ini menyediakan berbagai opsi eksekusi, cara memanfaatkan inline metadata, beragam metode deklarasi dependensi, serta berbagai fitur kontrol
Lingkungan Python dan peran uv
- Python memiliki lingkungan tersendiri untuk setiap instalasi
- Secara umum, membuat dan mengelola virtual environment adalah praktik yang disarankan
- uv mengelola virtual environment secara otomatis dan menangani dependensi dengan pendekatan deklaratif
- Skrip sederhana dapat langsung dijalankan hanya dengan
uv run example.py
- Jika hanya memakai standard library, semuanya berjalan tanpa pengaturan tambahan
Meneruskan argumen dan cara input
- Argumen baris perintah dapat diteruskan ke skrip
- Kode skrip juga dapat diterima dan dijalankan langsung dari standard input, serta mendukung fitur here-document
Lingkungan proyek dan opsi --no-project
- Jika skrip dijalankan di dalam folder proyek (misalnya yang memiliki
pyproject.toml), dependensi proyek juga akan dipasang
- Jika tidak diperlukan, lingkungan proyek dapat diabaikan dengan menempatkan flag
--no-project sebelum nama skrip
Deklarasi dan pengelolaan dependensi skrip
- Jika memerlukan paket eksternal, dependensi dapat ditentukan saat menjalankan skrip dengan opsi baris perintah
--with
- Batasan versi tertentu juga didukung, dan beberapa dependensi dapat ditambahkan dengan mengulangi opsi tersebut
- Dependensi tambahan bisa disertakan di lingkungan proyek, dan jika tidak diinginkan dapat dikendalikan dengan
--no-project
Inline Script Metadata (format PEP 723)
- Python kini mendukung format standar untuk mendeklarasikan dependensi atau versi Python langsung di dalam skrip
- Dengan
uv init --script, skrip yang berisi inline metadata dapat dibuat dengan mudah
- Dengan
uv add --script, dependensi yang dibutuhkan skrip dapat ditambahkan dan dikelola dalam format TOML
- Jika inline metadata tersedia, dependensi proyek akan diabaikan dan hanya dependensi skrip yang diterapkan
Deklarasi dan pengelolaan versi Python
- Versi Python yang diinginkan dapat ditentukan di dalam skrip atau saat eksekusi
- Jika versi yang ditentukan belum tersedia, versi tersebut akan diunduh dan dikonfigurasi secara otomatis
Menulis skrip yang bisa langsung dijalankan dengan shebang
- Dengan shebang (
#!...), file eksekusi dapat dibuat agar berjalan langsung menggunakan pendekatan uv run --script
- Dalam kasus ini, deklarasi dependensi dan versi Python juga dapat dituliskan di bagian atas skrip
Dukungan indeks paket dan autentikasi
- Opsi
--index memungkinkan penggunaan indeks paket kustom
- Informasi indeks juga dapat dimasukkan ke dalam metadata
- Jika memerlukan autentikasi, dokumentasi terpisah dapat dijadikan rujukan
Mengunci dependensi (Lock) dan meningkatkan reproduktibilitas
- Dengan
uv lock --script, file lock tingkat skrip dapat dibuat dan dikelola
- Setelah itu, saat menjalankan skrip atau menambahkan dependensi, file lock akan digunakan kembali dan diperbarui bila diperlukan
- Tersedia opsi
exclude-newer untuk reproduktibilitas versi, yaitu mengecualikan rilis setelah tanggal tertentu
- Tanggal ditentukan dalam format timestamp RFC 3339
Fleksibilitas versi Python
- Pada setiap eksekusi, versi Python apa pun dapat ditentukan melalui opsi baris perintah
- Contoh:
uv run --python 3.10 example.py
Dukungan Windows
- Skrip dengan ekstensi
.pyw dijalankan dengan pythonw di Windows
- Skrip berbasis GUI juga dapat dijalankan bersama dependensinya
Dokumen referensi
- Untuk penggunaan perintah yang lebih rinci, lihat dokumentasi referensi CLI serta panduan eksekusi/pemasangan alat
Kesimpulan
- uv adalah alat yang secara otomatis dan praktis mengelola lingkungan eksekusi, dependensi, versi, indeks paket, serta reproduktibilitas skrip Python, sehingga meningkatkan produktivitas dan keandalan sekaligus
7 komentar
Saya juga sudah mencoba beralih dari pip ke uv, dan ternyata memang cukup layak pindah hanya karena satu hal: kecepatannya benar-benar kencang.
Sering muncul jadi kemarin saya baru pertama kali mencobanya.. benar-benar cepat. Wah..
Sepertinya saya sudah melihat lebih dari 5 postingan terkait uv di sini;;;
Mengesampingkan fitur lainnya, alasan untuk memakainya sudah cukup hanya dari segi kecepatan saja.
Kalau disuruh pakai
piplagi, rasanya saya benar-benar tidak akan sanggup.Untuk pengelolaan paket sistem ala conda, saya menggantinya dengan
flake.nix, dan selain proyek kolaboratif atau proyek lama yang dikelola dengan conda+pip, secara pribadi ke depannya saya rasa akan memakai uv+nix.Uv - alat packaging Python super cepat yang diimplementasikan dengan Rust
Merevolusi workflow pengembangan Python dengan UV
Memanfaatkan skrip Python dengan uv dan PEP 723
Setelah 1 tahun memakai uv: kelebihan, kekurangan, dan hal yang perlu dipertimbangkan saat migrasi
Saya baru-baru ini mengganti sebagian besar eksekusi Python dengan uv, dan itu benar-benar cepat.
Memang ada beberapa fitur lanjutan yang tidak sepenuhnya kompatibel, tetapi dalam kebanyakan kasus perilakunya hampir sama.
Opini Hacker News
Saya merasakan sendiri bahwa fitur "deklarasi dependensi skrip" benar-benar berguna
Seperti yang diperkenalkan dalam panduan resmi, Anda bisa menuliskan dependensi sebagai komentar di bagian paling atas kode Python seperti berikut
Setelah file ini disimpan sebagai script.py lalu dijalankan dengan
uv run script.py, dependensi yang dinyatakan akan secara ajaib dipasang ke virtual environment sementara dan langsung bisa dijalankanIni merupakan implementasi dari PEP 723 di Python, dan Claude 4 juga mengetahui trik ini, jadi jika Anda memintanya menulis “skrip Python dengan dependensi skrip inline”, hasilnya akan dibuat dengan benar
Sebagai contoh, Anda bisa memintanya menulis kode yang menggunakan httpx dan click untuk mengunduh file besar sambil menampilkan progress bar
Sebelum Claude 4, fitur seperti ini memerlukan proyek khusus dan petunjuk terpisah, tetapi sekarang tidak lagi
Bisa juga merujuk ke contoh use case yang lebih rinci
Saya juga merasa mode shebang sangat berguna
Jika menambahkan shebang di baris pertama skrip seperti di bawah, file bisa dijalankan seperti
./script.shSaya berharap formatnya bisa sama seperti file requirements
Jika begitu, untuk pengguna yang tidak memiliki uv, kita juga bisa memberikan one-liner sederhana dalam komentar agar bisa memasang dependensi yang sama dengan pip
Misalnya, pendekatan seperti
pip install -r <(head myscript.py)tampaknya memungkinkanSebenarnya PEP723 kini didukung bukan hanya oleh uv yang sedang banyak dibicarakan, tetapi juga oleh pipx dan hatch
Dan dukungan untuk pip-tools dan lainnya juga sudah masuk dalam roadmap
(lihat issue terkait)
Saat pertama kali melihatnya, saya sempat mengira di samping requests ada emoji hati
Menurut saya pendekatan ini benar-benar keren
Tetapi suatu hari nanti saya berharap ini diadopsi sebagai sintaks bahasa bawaan, bukan magic comment
Komentar seperti ini terlihat agak berantakan
Tentu saja saya paham bahwa dari sudut pandang tool, magic comment lebih mudah diparse, dan ada pertimbangan struktural seperti Python core tidak terlalu banyak memuat pengetahuan packaging, tetapi saya tetap berharap suatu saat ada sintaks bawaan
Saya setuju dengan pendekatan seperti ini
Memang di Python file requirements.txt tidak wajib, tetapi cukup disayangkan karena jika pengelolaannya diabaikan, sering muncul ketidaknyamanan saat fungsinya rusak
Lihat tweet terkait
Saya ingin berbagi jebakan yang saya alami dengan pendekatan ini
Saya memakainya untuk skrip yang me-restart router saat internet putus, tetapi karena proses pemasangan dependensi bergantung pada koneksi internet, ketika jaringan benar-benar mati, skripnya sendiri jadi tidak bisa berjalan
Saya sempat menemukannya lebih awal dan mengatasinya dengan pra-instal dependensi, tetapi agar tidak mengulangi kesalahan saya, saya sarankan jangan menggunakannya di lingkungan airgapped yang benar-benar terisolasi dari jaringan
Meski ada cache uv, cache miss tetap bisa terjadi
Jika menggunakan opsi
uv run --offline, dependensi yang sudah tercache bisa dipakai untuk menjalankan tanpa mengecek versi baruHal yang sama juga berlaku untuk
uvx(uvx --offline ...)Pemahaman saya, jika ingin memakai dependensi atau venv, setidaknya harus pernah dijalankan sekali saat terhubung ke internet agar setelah itu bisa dipakai secara offline
Belakangan ini saya merasa beberapa fitur di ekosistem Python makin saling cocok dan bekerja bersama dengan baik
Dengan kombinasi dependensi skrip Marimo dan uv, saya mulai membuat alat pelaporan/diagnostik yang reproducible dan mudah dipakai tim lain
Fitur uv inilah yang paling saya sukai dan menjadi alasan saya pindah ke uv
Saya punya beberapa skrip git-hooks yang masing-masing memiliki dependensi tersendiri, dan saya tidak ingin memasangnya ke venv utama
Cukup dengan menambahkan satu baris
#!/usr/bin/env -S uv run --script --python 3.13, saya hanya perlu memberi tahu para developer untukbrew install uv, dan mereka bisa langsung memakai skrip itu tanpa perlu membuat venv terpisahAdakah yang tahu kenapa flag
-Sdiperlukan?Di lingkungan BSD saya,
/usr/bin/env -S uv run --python 3.11 pythondan/usr/bin/env uv run --python 3.11 pythonsama-sama menjalankan Python shell, jadi rasanya hasilnya samaBahkan setelah melihat manual env pun saya belum mendapat penjelasan yang jelas, jadi jika ada info berguna saya ingin mendengarnya
(
-Sdi sini berfungsi memecah argumen berdasarkan spasi)Berkat UV, migrasi besar-besaran pekerjaan Python yang awalnya ingin saya pindahkan ke golang jadi bisa diperkecil ruang lingkupnya
Terutama pekerjaan kecil berbentuk skrip, kini tidak perlu dipindahkan lagi
Saya yakin fitur ini benar-benar "killer feature"
Jika ada Pytorch di dalam dependensi, pendekatan ini mungkin agak terbatas
Uv memang menyediakan dukungan integrasi yang bagus untuk Pytorch, tetapi hanya dengan header skrip saja, sayangnya tidak ada cara yang jelas untuk memilih wheel index yang paling sesuai (CPU, CUDA, ROCm, dll.)
Saya berharap venv yang otomatis dibuat uv bisa lebih mudah dikenali oleh VS Code
Saat ini Python extension menandai semua import pihak ketiga dengan garis merah
Solusi sementara saya adalah mencari jalur venv secara manual dari direktori Cache uv lalu mendaftarkannya, tetapi jika venv sering dibuat ulang, saya harus mengulanginya lagi sehingga merepotkan
uv python find --script "${filePath}"Saya sedang mengembangkan ekstensi yang akan mendeteksi fitur tersebut secara otomatis di VS Code dan mengaktifkannya
Saya sangat menyukai fitur UV ini
Bahkan jupyter notebook juga bisa dijalankan dengan one-liner seperti berikut tanpa instalasi terpisah
Semua akan dipasang ke virtual environment sementara, lalu setelahnya dibersihkan
Jika dijalankan di dalam proyek, dependensi proyek terkait juga akan dikenali secara otomatis
Namun sebenarnya pembersihannya tidak sepenuhnya "bersih", karena folder cache uv bisa terus membesar
Saya juga sering memakainya seperti
uv run --with ipython --with boto3 ipython, dan ini benar-benar sangat menghemat waktuBelakangan saya menemukan isu kecil terkait
uv runJika skrip dijalankan dari luar folder proyek, perilakunya adalah mencari pyproject.toml dari current working directory, bukan dari lokasi file skrip yang sebenarnya
Karena itu, skrip yang dependensinya disimpan di pyproject.toml mungkin tidak akan berjalan semestinya jika dijalankan dari luar dengan bentuk seperti
uv run path/to/my/script.pyIni bisa diatasi dengan selalu memakai dependensi inline, atau dengan argumen
--project, tetapi jadi tidak praktis karena jalur skrip harus ditulis dua kaliuv sendiri sangat hebat, tetapi karakteristik kecil ini terasa cukup merepotkan
Saya sudah cukup puas menggunakan pendekatan shebang khusus uv dan dependensi dalam skrip
Lebih mengesankan lagi, ada
uv lock --script example.pyyang bisa membuat file lock khusus untuk satu skripPython packaging sudah berjalan lebih dari 20 tahun, dan mengejutkan rasanya pengalaman yang senatural ini baru muncul sekarang
Di organisasi kami, dependensi dalam lockfile juga dipindai dengan
trivy fs uv.lockdan semacamnya untuk mencegah eksekusi kode yang memiliki CVE yang sudah diketahui