Memanfaatkan Skrip Python dengan uv dan PEP 723
(cottongeeks.com)- Manajer paket uv dan PEP 723 memungkinkan eksekusi skrip Python tanpa masalah dependensi
- Fitur uvx secara otomatis membuat virtual environment disposable sehingga mengatasi kerepotan pengaturan lingkungan
- Jika metadata PEP 723 disertakan di file Python, eksekusi otomatis skrip dan pengelolaan paket menjadi lebih praktis
- Sebagai contoh skrip eksekusi, program ekstraksi subtitle YouTube dapat diimplementasikan dan didistribusikan dengan cepat
- Dengan ini, Python kini juga memungkinkan penulisan file eksekusi tunggal yang ringkas, sehingga kegunaan skrip meningkat drastis
Gambaran umum
- Ketidaknyamanan karena harus melalui proses pengaturan lingkungan dan instalasi paket setiap kali menjalankan "skrip sekali pakai (one-off)" di Python kini hilang berkat hadirnya uv dan PEP 723
- uv adalah manajer paket dan proyek Python berkecepatan tinggi yang dikembangkan dengan Rust, dan bersama fitur baru uvx dapat menangani pembuatan virtual environment disposable, instalasi paket otomatis, serta pengaitan versi Python dengan sangat cepat dan mudah
Kelebihan uv dan uvx
- Fitur uvx bekerja mirip npx di ekosistem Nodejs, dengan cepat membuat lingkungan eksekusi untuk paket Python tertentu (misalnya ruff)
- Memanfaatkan disposable virtual environment sebagai cache sehingga memberikan eksekusi cepat tanpa overhead
- Pengaturan lingkungan dan instalasi dependensi cukup dilakukan dengan satu baris perintah, sehingga developer tidak perlu mengelola konfigurasi lingkungan secara terpisah
Pengenalan dan pemanfaatan PEP 723
- PEP 723 menetapkan standar agar metadata dependensi dan lingkungan dapat disertakan di bagian atas skrip Python
- Contoh:
requires-python,dependencies, dan sebagainya dapat dituliskan di bagian atas kode - Tool eksternal yang mengenalinya (seperti uv) akan menggunakan informasi di dalam file skrip untuk menangani instalasi otomatis, pengaturan lingkungan, dan eksekusi
Kombinasi uv dan PEP 723
- Dengan menuliskan metadata tersebut di bagian atas file contoh Python dan menjalankannya memakai perintah
uv run, semua paket yang diperlukan akan langsung terinstal otomatis, versi Python yang ditentukan akan disiapkan, lalu kode dijalankan - Kode contoh memanggil API internet (daftar PEP) dan menampilkan hasilnya. Semua itu dapat dijalankan dalam satu baris tanpa instalasi paket tambahan atau konfigurasi lingkungan
Contoh praktis: skrip subtitle YouTube
- Disediakan contoh skrip Python yang menambahkan shebang (
#!/usr/bin/env -S uv run --script) dan metadata PEP 723 - Paket eksternal seperti
youtube-transcript-apiakan dipasang otomatis dan virtual environment juga disiapkan secara otomatis - Pengguna cukup memberikan URL atau ID video YouTube sebagai argumen ke file eksekusi (
ytt), lalu subtitle akan diekstrak dan hasilnya langsung diberikan - Setelah memberi izin eksekusi dengan
chmod, skrip dapat dijalankan dengan mudah dari terminal
Peningkatan pengalaman developer dan perluasan kemungkinan
- Dulu, bahkan untuk menjalankan skrip sederhana, bahasa yang menghasilkan binary eksekusi tunggal seperti Go sering lebih disukai, tetapi kini Python juga menawarkan kemudahan pada tingkat yang setara
- Kombinasi uv dan PEP 723 membuat berbagi, mendistribusikan, dan mengotomatisasi eksekusi skrip Python menjadi jauh lebih mudah
- Contoh di Github (
cottongeeks/ytt-mcp) menunjukkan bahwa use case yang lebih kompleks juga dapat dikembangkan
2 komentar
uv memang sangat cepat, jadi enak dipakai. Belakangan ini saya menggunakannya di semua tempat yang memungkinkan.
Opini Hacker News
Seperti penulis postingan, belakangan saya lebih sering memilih Python lintas platform untuk one-off dan skrip pribadi daripada Go, tetapi saya tetap kurang puas karena sistem type checking Python benar-benar kacau; saya berharap tool seperti ty dan pyrefly bisa sedikit memperbaiki situasi ini
Sekarang rasanya skrip Python bisa langsung berjalan dengan baik tanpa harus repot karena virtualenv Saya juga berharap pengalaman seperti ini bisa hadir di dunia shell script Packaging, manajemen dependensi, dan reproduksibilitas masih terasa seperti zaman batu Realitanya sekarang masih antara pasrah dengan
curl | bash, atau hanya diberi file README berisi 3 dependensi yang hilang dan 12 langkah manual Nix? Rasanya itu pilihan yang berguna hanya untuk orang yang sudah melampaui waktu, ruang, dan manual Nix Docker? Kalau menurut Anda mengunduh distribusi Linux hanya untuk menjalankan satu perintahseditu masuk akal, silakan saja Saya merasa kita benar-benar butuh titik tengah yang sederhana, deklaratif, dan mudah dipakai semua orangIni benar-benar tren yang keren dan terasa makin populer Saya pertama kali mengetahuinya dari blog simonw, dan bisa melihat bahasannya di posting blog simonwillison Pada bulan Maret tahun ini juga ada diskusi Hacker News dari posting blog lain Saya berharap tren ini bisa bertahan lama di halaman utama agar lebih banyak orang menyadarinya
Setelah mencoba uv untuk proyek kecil, pengalamannya benar-benar luar biasa Kombinasi
uv rundanuv tool run(uvx) membuat proses memasang dan langsung menjalankan skrip Python dari GitHub di VM menjadi sangat sederhana Tidak perlugit clone, tidak perlu membuat atau masuk ke venv, dan tidak perlupip installYang paling penting, uv sangat cepat sampai awalnya terasa seperti ada yang salah; kenyataannya hasilnya memang 10x lebih cepat daripada pip Memang tool dan dokumentasinya masih sedikit belum matang, tetapi dengan tingkat inovasi dan kepraktisan seperti itu, menurut saya tetap sangat layak dipakai--helpRust juga sedang mengembangkan ide shell script tipe single-file yang mirip seperti ini Saya pertama kali melihat pendekatan seperti ini di Rust, termasuk dukungan menjalankan satu file dengan manajemen dependensi Saya berharap pola ini bisa mapan di lebih banyak bahasa, karena sangat berguna untuk dibagikan lewat gist atau untuk menulis tool kecil dengan cepat Lihat juga dokumen RFC cargo-script
Saat menggunakan
uv run --scriptdan metadata disertakan di dalam skrip, agak kurang nyaman untuk langsung membuka Python REPL dari skrip lalu menguji perubahan Misalnya harus seperti ini,Saya berharap ada cara yang lebih ringkas Misalnya akan sangat ideal kalau bisa seperti
Namun pada praktiknya, kalau dijalankan seperti di bawah ini, kita bisa langsung masuk ke Python dan environment venv yang sesuai untuk skrip tersebut
Hanya saja, environment-nya tetap perlu dibuat terlebih dahulu dengan menjalankan skrip setidaknya sekali
--interactiveke dalam skrip dan menjadikannya opsi CLI Saya cukup sering menulis CLI kecil berbasis Typer dengan cara seperti ini Dalam skrip dev, saya juga pernah memakai flag--sqluntuk masuk ke DuckDB SQL REPLJika memakai conda, Anda bisa langsung mengaktifkan environment dari shell wrapper untuk skrip Python Tulis seperti berikut
Namun ini bukan pendekatan yang mandiri seperti gaya PEP 723
Setelah melihat thread HN kemarin dan hari ini, saya akhirnya memutuskan mencoba uv untuk pertama kalinya, dan sangat terkesan dengan kecepatannya serta kemudahan manajemen dependensi Akan lebih baik jika dokumentasi resminya ditingkatkan, terutama jika ada panduan berpindah dari alur kerja requirements.txt ke uv Ada juga bagian yang membingungkan soal penetapan versi Python per proyek (
.python-versiondanpyproject.tomlsama-sama mendefinisikannya)requires-versiondipyproject.tomlberarti rentang versi yang dijamin kompatibel, sedangkan.python-versionmenetapkan versi spesifik yang dipakai untuk pengembangan Saat dibuat denganuv init, awalnya keduanya mungkin tampak sama, tetapi seiring wakturequires-versionakan menetapkan versi minimum yang didukung yang lebih rendah daripada.python-versionrequires-versionjuga masuk ke metadata paket dan memengaruhi resolusi dependensi bagi orang lain yang menggunakan paket yang Anda distribusikan Misalnya ketika v1 masih mendukung Python 3 versi lama tetapi v2 tidak laginpmataudotnet, saat berganti platform memang perlunpm updateataudotnet restore, tetapi venv tetap bekerja dengan baik tanpa masalah Sebaliknya, uv terasa lebih rumit dan perlu pembersihan manual ketika berpindah platform seperti inipyproject.toml(terlepas dari uv sendiri) dipakai untuk mendefinisikan environment yang diperlukan saat Anda membagikan kode ke pengembang dan pengguna lain Saat membangun paket untuk PyPI, file itu menjelaskan environment apa yang dibutuhkan, dan rentang versinya diatur agar lebih banyak orang bisa memakai ulang kode tersebut.python-versionhanya dipakai oleh uv, dan hanya sebagai acuan saat menyiapkan environment pengembangan saya Jika Anda sudah memiliki environment yang siap, tidak masalah jika tidak membuatnya lagi uv memang belum menjadi build backend resmi, tetapi sedang menyiapkan fitur itu (issue #3957).python-versionlebih untuk kompatibilitas dengan tool lain yang tidak punya parser TOMLDulu saya pernah ingin membuat tool yang membuat skrip Python bisa memasang dependensinya sendiri (Targetnya adalah tool yang bekerja seperti uvx, tetapi bisa berjalan hanya dengan Python yang sudah ada) Namun kekurangannya adalah harus menambahkan beberapa baris aneh di bagian awal skrip Kalau penasaran, tool itu dirilis di PyPI dengan nama pysolate
Pesan bergaya Grace Hopper yang terinspirasi dari COBOL Ada pendapat bahwa semua program Python seharusnya memiliki ENVIRONMENT division yang mendefinisikan dengan jelas environment kompilasi dan eksekusi, termasuk kebutuhan hardware dan software Struktur seperti ini dianggap akan sangat berpengaruh dalam meningkatkan portabilitas program di berbagai sistem