uv ve PEP 723 ile Python betiklerinden yararlanmak
(cottongeeks.com)- uv paket yöneticisi ve PEP 723 sayesinde bağımlılık sorunları olmadan Python betikleri çalıştırmak mümkün hale geliyor
- uvx özelliği, geçici sanal ortamları otomatik oluşturarak ortam kurulumundaki zahmeti ortadan kaldırıyor
- PEP 723 meta verisi Python dosyasına eklendiğinde betiğin otomatik çalıştırılması ve paket yönetimi çok daha pratik hale geliyor
- Çalışan betik örneği olarak bir YouTube altyazı çıkarma programı hızla geliştirilebilir ve dağıtılabilir
- Böylece artık Python ile de kısa ve tek başına çalıştırılabilen dosyalar yazmak mümkün oluyor; bu da betiklerin kullanım alanını büyük ölçüde genişletiyor
Genel bakış
- Python'da "tek seferlik (one-off) betikler" çalıştırırken her defasında ortam kurma ve paket yükleme zorunluluğu vardı; uv ve PEP 723 ile bu zahmet ortadan kalkıyor
- uv, Rust ile geliştirilmiş yüksek hızlı bir Python paket ve proje yöneticisi; yeni uvx özelliğiyle birlikte geçici sanal ortam oluşturma, paketleri otomatik kurma ve Python sürümüyle eşleştirmeyi son derece hızlı ve kolay biçimde yapıyor
uv ve uvx'in avantajları
- uvx özelliği, Nodejs ekosistemindeki npx'e benzer şekilde çalışarak belirtilen Python paketini (ör. ruff) çalıştırmak için hızlıca bir ortam oluşturuyor
- Geçici sanal ortamı önbellek olarak kullanarak ek yük olmadan hızlı çalıştırma sağlıyor
- Ortam kurulumu ve bağımlılık yükleme tek bir komut satırıyla yapıldığından, geliştiricinin ayrıca ortam yapılandırmasını yönetmesine gerek kalmıyor
PEP 723'e giriş ve kullanım
- PEP 723, Python betiğinin en üst kısmına bağımlılık ve ortam meta verisi eklenebilmesi için bir standart tanımlıyor
- Örnek: kodun üst bölümünde
requires-python,dependenciesgibi alanlar belirtilebiliyor - Bu bilgiyi tanıyan harici araçlar (ör. uv), betik dosyasındaki veriye bakarak otomatik kurulum, ortam hazırlığı ve çalıştırmayı gerçekleştiriyor
uv ve PEP 723'ün birleşimi
- Gerçek bir Python örnek dosyasının üst kısmına bu meta veri yazıldığında, uv'nin
runkomutuyla çalıştırma sırasında gerekli tüm paketler otomatik kuruluyor, belirtilen Python sürümü ayarlanıyor ve ardından kod yürütülüyor - Örnek kod internet üzerindeki bir API'yi (PEP listesi) çağırıp sonucu ekrana yazdırıyor. Ek paket kurulumu ya da ortam ayarı olmadan tek satırla çalıştırılabiliyor
Pratik örnek: YouTube altyazı betiği
shebang(#!/usr/bin/env -S uv run --script) ve PEP 723 meta verisi eklenmiş bir Python betiği örneği sunuluyoryoutube-transcript-apigibi harici paketler otomatik kuruluyor ve sanal ortam da otomatik hazırlanıyor- Kullanıcı, çalıştırılabilir dosyaya (
ytt) YouTube video URL'sini ya da ID'sini argüman olarak verdiğinde, betik altyazıları çıkarıp sonucu anında sunuyor chmodile çalıştırma izni verildikten sonra terminalden kolayca kullanılabiliyor
Geliştirici deneyiminin iyileşmesi ve olasılıkların genişlemesi
- Geçmişte basit betikleri çalıştırmak için Go gibi tek yürütülebilir dosya üreten diller daha çok tercih ediliyordu; artık Python da benzer düzeyde kolaylık sunuyor
- uv ve PEP 723 kombinasyonu sayesinde Python betiklerini paylaşmak, dağıtmak ve otomatik çalıştırmak çok daha kolay hale geliyor
- Github örneği (
cottongeeks/ytt-mcp) üzerinden daha karmaşık kullanım senaryoları da geliştirilebiliyor
2 yorum
uv çok hızlı olduğu için gerçekten hoşuma gidiyor. Bu aralar mümkün olan her yerde uv kullanıyorum.
Hacker News görüşleri
Yazının yazarı gibi ben de bugünlerde Go yerine çapraz platform Python one-off işleri ve kişisel script’lere daha çok yöneliyorum, ama Python’ın type checking sistemi tam bir kaos olduğu için memnun değilim; ty, pyrefly gibi araçların bunu biraz olsun iyileştirmesini umuyorum
Artık Python script’leri
virtualenvyüzünden uğraştırmadan doğrudan düzgün çalışıyormuş gibi hissettiriyor Shell script tarafında da böyle bir deneyim olsa keşke diye düşünüyorum Paketleme, bağımlılık yönetimi ve yeniden üretilebilirlik hâlâ taş devri seviyesinde Şu an gerçeklik yacurl | bashile şansa güvenmek ya da içinde 3 eksik bağımlılık ve 12 manuel adım olan bir README dosyasından ibaret Nix? Ancak zamanı, mekânı ve Nix kılavuzunu aşmış insanlar için işe yarar bir seçenek gibi Docker? Sırf bir kezsedkomutu kullanmak için bir Linux dağıtımı indirmek sana mantıklı geliyorsa fena seçenek değil Herkesin kolayca kullanabileceği, basit ve deklaratif bir orta noktaya gerçekten ihtiyaç var diye düşünüyorumuvgibi araçlar her şeyi hallediyor Clojure seviyorsan babashka da tavsiye ederimGerçekten harika bir trend ve giderek daha yaygınlaştığını hissediyorum Bunu ilk kez simonw’nin blogunda görmüştüm; ilgili içerik için simonwillison’un blog yazısına bakılabilir Bu yıl mart ayında başka bir blog yazısı üzerinden Hacker News tartışması da olmuştu Bu trendin ana sayfada uzun süre kalıp daha fazla kişinin dikkatini çekmesini isterim
uv’yi küçük projelerde denedim, deneyim gerçekten çok iyiuv runveuv tool run(uvx) kombinasyonuyla GitHub’daki Python script’lerini bir VM üzerinde doğrudan kurup çalıştırmak aşırı kolaygit cloneyok,venvoluşturma ya da içine girme yok,pip installda yok En önemlisiuvo kadar hızlı ki ilk başta bir şeylerin yanlış gittiğini düşündürüyor; gerçektepip’ten 10 kat hızlı sonuç veriyor Yine de araç ve dokümantasyon biraz ham, ama yenilik ve pratiklik seviyesi bunu fazlasıyla telafi ediyoruv’nin bağımlılıkları kurmasının,pyenv’in--helpçıktısını göstermesinden daha hızlı olmasına içtenlikle hayran kaldımRust da benzer şekilde tek dosyalık, type’lı shell script fikrini geliştiriyor Bu yaklaşımı ilk kez Rust tarafında görmüştüm; tek dosya çalıştırma ve bağımlılık yönetimini birlikte destekliyordu Bu kalıbın daha fazla dilde yerleşmesini isterim; gist olarak paylaşmak ya da hızlı küçük araçlar yazmak için çok kullanışlı cargo-script RFC belgesine de bakılabilir
uv run --scriptkullanırken metadata’yı script’in içine koyarsan, script’ten doğrudan Python REPL açıp değişiklikleri denemek biraz kullanışsız oluyor Mesela aşağıdaki gibi yapmak gerekiyor,Daha kısa bir yol olsa iyi olurdu Örneğin,
gibi bir şey ideal olurdu, ama pratikte aşağıdakini çalıştırınca script’e uygun Python ve
venvortamına doğrudan girilebiliyorYalnız bunun için ortamın oluşturulması adına script’i bir kez çalıştırmış olmak gerekiyor
--interactivegibi bir flag ekleyip bunu CLI seçeneği hâline getirebilirsin Genelde Typer tabanlı küçük CLI’leri bu şekilde yazıyorum Geliştirme script’lerinde--sqlflag’i ile DuckDB SQL REPL açtığım da olducondakullanıyorsan, Python script’i için shell wrapper içinde ortamı doğrudan aktive edebilirsin Şöyle yazılabilir:Yine de bu yaklaşım PEP 723 tarzı kadar bağımsız değil
Dünkü ve bugünkü HN başlıklarını görünce ilk kez
uvdenemeye karar verdim; hızı ve bağımlılık yönetiminin kolaylığı beni çok etkiledi Resmi dokümantasyon daha iyi olsa harika olurdu; özelliklerequirements.txtiş akışındanuv’ye geçiş kılavuzu çok faydalı olur gibi Proje bazında Python sürümü belirleme kısmı biraz kafa karıştırıyor (.python-versionvepyproject.tomliçinde iki farklı yerde tanımlanması)pyproject.tomliçindekirequires-versionalanı, uyumluluğun garanti edildiği sürüm aralığını ifade eder;.python-versionise geliştirmede kullanılacak belirli sürümü belirtiruv initile oluşturulduklarında başlangıçta aynı görünebilirler, ama zamanlarequires-version,.python-versiondeğerinden daha düşük bir minimum destek sürümünü gösterebilirrequires-versionpaket metadata’sına da girer ve yayımladığın paketi kullanacak başkalarının bağımlılık çözümlemesini de etkiler Örneğin v1 eski Python 3 sürümlerini desteklerken v2 artık desteklemeyebilirnpm updateveyadotnet restoregerekse de,venvsorunsuz çalışıyor Buna karşılıkuv, platform değişimlerinde işleri daha karmaşık ve elle temizlik gerektirir gibi hissettiriyorpyproject.toml, (uvile doğrudan ilgili olmaktan bağımsız olarak) kodunu dış geliştiriciler ve kullanıcılarla paylaşırken gereken ortamı tanımlamak içindir PyPI için paket derlerken hangi ortamın gerektiğini belirtir ve sürüm aralıkları da daha çok kişinin kodu yeniden kullanabilmesi için belirlenir.python-versionise yalnızcauv’ye, yani benim geliştirme ortamımı kurarken başvurulan bilgiye yöneliktir Hazır bir ortamın zaten varsa bunu ayrıca ayarlaman şart değiluvhenüz resmi bir build backend değil ama bunun üzerinde çalışıyor (issue #3957).python-versiondosyasının rolü, TOML parser’ı olmayan diğer araçlarla uyumluluk sağlamak olabilir diye tahmin ediyorumEskiden Python script’lerinin bağımlılıkları kendi kendine kurmasını sağlayan bir araç yapmayı istemiştim (Hedef,
uvxgibi çalışan ama yalnızca Python kurulu olsa bile işleyen bir araçtı) Ama script’in en üstüne biraz tuhaf görünen birkaç satır eklemek gerekmesi bir dezavantajdı Merak edenler için PyPI’dapysolateadıyla yayımlanmış durumdaCOBOL’dan ilham alan Grace Hopper tarzı bir mesaj Her Python programının derleme ve çalışma ortamını, donanım ve yazılım gereksinimleri dâhil, açıkça belirten bir ENVIRONMENT division tanımlaması gerektiğini savunuyor Böyle bir yapı, programların farklı sistemler arasında taşınabilirliğini artırmada belirleyici olur