- uv, Python betiklerini çalıştırırken bağımlılık yönetimini otomatikleştirir
- Ayrı bir sanal ortam yönetimi olmadan, her betik için ortam otomatik olarak oluşturulur ve korunur
- Gerekli paketler inline metadata veya komut satırı seçenekleri gibi çeşitli yöntemlerle bildirilebilir
- Python sürümü ve paket yönetimi de betik bazında bildirilebilir ve otomatik olarak ayarlanabilir
- Lock dosyaları ve bağımlılık sürüm kısıtlama seçenekleriyle yeniden üretilebilirlik ve bakım kolaylığı artar
Genel Bakış
- uv, Python betiklerini çalıştırırken o betiğin ihtiyaç duyduğu paket bağımlılıklarını otomatik olarak yöneten bir araçtır
- Kullanıcının zahmetli sanal ortam oluşturma ve paket kurma işlemlerini elle yapması gerekmez
- Çeşitli çalıştırma seçenekleri, inline metadata kullanımı, farklı bağımlılık bildirim yöntemleri ve çeşitli kontrol özellikleri sunar
Python ortamı ve uv'nin rolü
- Python, her kurulum için kendine özgü bir ortama sahiptir
- Genel olarak sanal ortam oluşturmak ve yönetmek tavsiye edilir
- uv, sanal ortamları otomatik olarak yönetir ve bağımlılıkları bildirimsel bir yaklaşımla ele alır
- Basit betikler
uv run example.py ile anında çalıştırılabilir
- Standart kütüphane kullanıldığında ek yapılandırma olmadan çalışır
Argüman iletimi ve girdi yöntemleri
- Betiğe komut satırı argümanları geçirilebilir
- Standart girdiden doğrudan betik kodu alarak çalıştırabilir; ayrıca here-document özelliğini de destekler
Proje ortamı ve --no-project seçeneği
- Betik bir proje klasöründe (
pyproject.toml bulunan bir yer gibi) çalıştırılırsa, proje bağımlılıkları da kurulur
- Buna gerek yoksa,
--no-project bayrağı betik adından önce eklenerek proje ortamı yok sayılabilir
Betik bağımlılıklarını bildirme ve yönetme
- Harici paketler gerekiyorsa, komut satırı seçeneği
--with kullanılarak bağımlılıklar belirtilip çalıştırılabilir
- Belirli sürüm kısıtları da desteklenir ve birden fazla bağımlılık seçenek tekrar edilerek belirtilebilir
- Proje ortamına ek bağımlılıklar eklenebilir; istenmiyorsa
--no-project ile kontrol edilebilir
Inline Script Metadata (PEP 723 yöntemi)
- Python artık betiğin içinde bağımlılıkları veya Python sürümünü bildirmek için standart bir biçimi destekliyor
uv init --script ile inline metadata içeren bir betik kolayca oluşturulabilir
uv add --script ile betik için gerekli bağımlılıklar TOML biçiminde eklenip yönetilebilir
- Inline metadata varsa, proje bağımlılıkları yok sayılır ve yalnızca betiğin bağımlılıkları uygulanır
Python sürümünü bildirme ve yönetme
- Betiğin içinde veya çalıştırma sırasında istenen Python sürümü belirtilebilir
- Belirtilen sürüm yoksa otomatik olarak indirilir ve ayarlanır
Shebang ile doğrudan çalıştırılabilen betikler yazma
- Shebang (
#!...) kullanılarak uv run --script biçiminde doğrudan çalıştırılabilen dosyalar oluşturulabilir
- Bu durumda da bağımlılık bildirimi ve Python sürümü gibi bilgiler betiğin üst kısmında belirtilebilir
Paket indeksi ve kimlik doğrulama desteği
--index seçeneğiyle özel paket indeksleri kullanılabilir
- İndeks bilgileri de metadata içine dahil edilebilir
- Kimlik doğrulama gerekiyorsa ilgili belgelere başvurulabilir
Bağımlılık kilitleme (Lock) ve yeniden üretilebilirliği artırma
uv lock --script ile betik bazında Lock dosyaları oluşturulup yönetilebilir
- Daha sonra çalıştırma veya bağımlılık ekleme sırasında lock dosyası yeniden kullanılır ve gerektiğinde güncellenir
- Sürüm yeniden üretilebilirliği için
exclude-newer seçeneği sunulur; bu seçenek belirli bir tarihten sonraki sürümleri hariç tutar
- Tarih, RFC 3339 zaman damgası ile belirtilir
Python sürümünde esneklik
- Her çalıştırmada komut satırı seçeneğiyle istenen herhangi bir Python sürümünün kullanılması belirtilebilir
- Örnek:
uv run --python 3.10 example.py
Windows desteği
.pyw uzantılı betikler Windows'ta pythonw ile çalıştırılır
- GUI tabanlı betikler de bağımlılıklarıyla birlikte çalıştırılabilir
Referans belgeler
- Daha ayrıntılı komut kullanımı için CLI referans belgeleri ile aracın çalıştırma/kurulum kılavuzlarına başvurulabilir
Sonuç
- uv, Python betiklerinin çalışma ortamını, bağımlılıklarını, sürümlerini, paket indekslerini ve yeniden üretilebilirliğini otomatik ve pratik şekilde yöneterek aynı anda hem üretkenliği hem de güvenilirliği artıran bir araçtır
7 yorum
Ben de
piptenuvye geçtim; gerçekten sadece hızının çok yüksek olması bile geçmeye değer bir seviye gibi geldi bana.Sık sık gündeme geliyordu, ben de dün ilk kez denedim.. gerçekten çok hızlıymış. Vay canına..
Sanırım burada uv ile ilgili 5'ten fazla gönderi gördüm;;;
Diğer özellikleri bir kenara bıraksak bile, sırf hızı için bile kullanmak için yeterli bir neden var.
Bana tekrar pip kullan deseler artık asla yapamam.
conda’nın sistem paketi yönetiminiflake.nixile değiştirip kullanıyorum; ortak çalışma gerektiren ya da mevcuttaconda+pipile bakımı yapılan projeler dışında, kişisel olarak bundan sonrauv+nixkullanacak gibi görünüyorum.Uv - Rust ile geliştirilmiş ultra hızlı Python paketleme aracı
UV ile Python geliştirme iş akışını dönüştürmek
uv ve PEP 723 ile Python betiklerinden yararlanmak
uv’yi 1 yıl kullanmak: artıları, eksileri ve geçişte dikkat edilmesi gerekenler
Son zamanlarda çoğu Python çalıştırmasını
uvile değiştirdim ve gerçekten çok hızlı.Birkaç gelişmiş özellik tam uyumlu olmasa da, çoğu durumda neredeyse aynı şekilde çalışıyor.
Hacker News yorumu
“Betik bağımlılıklarını bildirme” özelliğinin gerçekten çok kullanışlı olduğunu deneyimledim
Resmî kılavuzda anlatıldığı gibi, Python kodunun en üstüne yorum olarak bağımlılıkları şu şekilde yazabiliyorsunuz
Bu dosyayı
script.pyolarak kaydedip ardındanuv run script.pyile çalıştırırsanız, belirtilen bağımlılıklar sihirli bir şekilde geçici bir sanal ortama kuruluyor ve betik hemen çalışabiliyorBu, Python’un PEP 723 standardının bir uygulaması ve Claude 4 de bu numarayı bildiği için “satır içi betik bağımlılıkları içeren bir Python betiği” yazmasını isterseniz bunu doğru şekilde oluşturuyor
Örneğin
httpxveclickkullanarak büyük bir dosyayı indirip ilerleme çubuğu gösteren bir kod yazmasını isteyebilirsinizClaude 4’ten önce bu tür bir işlev için özel bir proje ve ayrıca yönlendirme gerekiyordu, ama artık gerekmiyor
Ayrıntılı kullanım örneklerine de bakabilirsiniz
shebang modu da gerçekten çok kullanışlı
Aşağıdaki gibi betiğin ilk satırına shebang eklerseniz
./script.shgibi çalıştırabilirsinizKeşke
requirementsdosyasıyla aynı biçimde olsaydıÖyle olsaydı,
uvkullanmayanlar için basit bir yorum satırıyla aynı şeyipipüzerinden kurabilecekleri tek satırlık bir komut da verilebilirdiÖrneğin
pip install -r <(head myscript.py)gibi bir yaklaşım mümkün olabilirdiAslında PEP723 bugünlerde dikkat çeken
uvdışındapipxvehatchtarafından da destekleniyorAyrıca
pip-toolsgibi araçlar da destek yol haritasında yer alıyor(ilgili issue)
İlk gördüğümde
requestsyanındaki şeyi kalp emojisi sanmıştımBunun gerçekten harika bir yaklaşım olduğunu düşünüyorum
Ama bir gün sihirli yorumlar yerine yerleşik dil sözdizimi olarak benimsenmesini isterdim
Yorumlar biraz dağınık görünüyor
Elbette araçlar açısından sihirli yorumların ayrıştırılması daha kolay ve Python çekirdeğinin paketleme bilgisi konusunda sınırlı olması gibi yapısal meseleler olduğunu biliyorum, ama yine de bir gün yerleşik sözdizimi olmasını isterim
Bu yaklaşıma katılıyorum
Python’da
requirements.txtzorunlu değil ama bakım ihmal edilirse işlerin bozulması çok kolay; bu can sıkıcıilgili tweet
Bu yaklaşımda karşılaştığım bir tuzağı paylaşmak istiyorum
İnternet kesildiğinde yönlendiriciyi yeniden başlatan bir betikte bunu kullanmıştım, fakat bağımlılık kurulum davranışı internet bağlantısına bağlı olduğu için ağ yoksa betiğin kendisi de çalışamaz hâle geliyor
Neyse ki bunu önceden fark edip bağımlılıkları önceden kurarak çözdüm, ama benim yaptığım hatayı yapmayın; gerçekten air-gapped bir ortamda (ağın tamamen izole olduğu bir ortamda) bunu kullanmamanızı öneririm
uvönbelleği olsa bile cache miss yaşanabiliruv run --offlineseçeneğiyle önbelleğe alınmış bağımlılıkları kullanıp yeni sürüm kontrolü yapmadan çalıştırabilirsinizAynı şey
uvxiçin de geçerli (uvx --offline ...)Anladığım kadarıyla bağımlılıkları veya
venv’yi kullanacaksanız, sonrasında çevrimdışı da kullanabilmek için en az bir kez internet bağlantısıyla çalıştırmanız gerekiyorSon zamanlarda Python ekosistemindeki çeşitli özelliklerin giderek daha uyumlu çalıştığını hissediyorum
Marimo ile
uvbetik bağımlılıklarını birleştirerek başka ekiplerin kullanması için uygun, yeniden üretilebilir raporlama/tanı aracı oluşturmaya başladımuviçindeki en sevdiğim özellik bu oldu; hatta bu yüzdenuv’ye geçtimBirden fazla git hook betiğinin her birinin ayrı bağımlılıkları vardı ve bunları ana
venviçine kurmak istemiyordumSadece
#!/usr/bin/env -S uv run --script --python 3.13satırını ekledim; geliştiricilere de yalnızcabrew install uvdemek yetti, ayrıcavenvoluşturmaya gerek kalmadan doğrudan betiğin içinde kullanabildiler-Sbayrağının neden gerekli olduğunu bilen var mı diye merak ediyorumBenim BSD ortamımda
/usr/bin/env -S uv run --python 3.11 pythonile/usr/bin/env uv run --python 3.11 pythonikisi de Python kabuğunu açıyor gibi görünüyor, yani sonuç aynıenvkılavuzuna baktım ama net bir açıklama göremedim; faydalı bir bilgi varsa duymak isterim(Buradaki
-S, argümanları boşluklara göre bölme işini yapıyor)UV sayesinde aslında Python’daki büyük bir taşıma işini
golangile yapmayı planlıyordum, ama UV sayesinde bu taşımanın kapsamını küçültebildimÖzellikle küçük betik tarzı işler için artık taşıma yapmaya gerek kalmadı
Bunun gerçek bir “killer feature” olduğuna eminim
Bağımlılıklar arasında Pytorch varsa bu yaklaşım biraz sınırlı kalabiliyor
uv, Pytorch için entegre desteği gayet iyi sunuyor, ancak yalnızca betik başlığıyla en uygun wheel indeksini (CPU, CUDA, ROCm vb.) açıkça seçmenin bir yolu olmaması üzücüKeşke VS Code,
uv’nin otomatik oluşturduğuvenv’yi kolayca tanıyabilseŞu an Python eklentisi tüm üçüncü taraf
importifadelerinin altını kırmızı çiziyorGeçici çözüm olarak
uvönbellek dizinindenvenvyolunu elle bulup kaydediyorum, amavenvsık sık yeniden oluşturulunca bunu tekrar tekrar yapmak gerekiyoruv python find --script "${filePath}"komutuyla ortam yolunu bulabilirsinizBunu VS Code içinde otomatik algılayıp etkinleştiren bir eklenti geliştiriyorum
UV’nin bu özelliğini gerçekten çok seviyorum
jupyter notebookbile ayrı kurulum gerektirmeden şu tek satırla çalıştırılabiliyorHer şey geçici bir sanal ortama kuruluyor ve sonrasında temizleniyor
Bir proje içinde çalıştırılırsa o projenin bağımlılıklarını da otomatik olarak algılıyor
Yine de tamamen “temiz” sayılmaz;
uvönbellek klasörü zamanla büyümeye devam edebilirBen de
uv run --with ipython --with boto3 ipythongibi komutları sık kullanıyorum ve gerçekten çok zaman kazandırıyorYakın zamanda
uv runile ilgili küçük bir sorun keşfettimBetiği proje klasörünün dışından çalıştırırsanız, gerçek betik dosyasının konumu yerine mevcut çalışma dizininde
pyproject.tomlarıyorBu yüzden bağımlılıklarını
pyproject.tomliçinde tutan bir betik, dışarıdanuv run path/to/my/script.pyşeklinde çalıştırıldığında düzgün çalışmayabiliyorBu durum her zaman satır içi bağımlılık kullanarak ya da
--projectargümanını vererek çözülebiliyor, ama betik yolunu iki kez yazmak gerektiği için kullanışsızuvgenel olarak çok iyi, ama bu küçük davranış oldukça can sıkıcı gelebiliyoruv’ye özel shebang ve betik içi bağımlılık yaklaşımını memnuniyetle kullanıyordumBuna ek olarak
uv lock --script example.pykomutuyla tek bir betiğe özel lock dosyası da üretilebilmesi beni daha da etkilediPython paketleme ekosistemi 20 yılı aşkın süredir var ve ancak şimdi bu kadar doğal bir deneyimin ortaya çıkmış olması şaşırtıcı
Bizim organizasyonda lockfile bağımlılıklarını
trivy fs uv.lockgibi araçlarla tarıyoruz; böylece bilinen CVE’lere sahip kodların çalıştırılmasını önlemeye de yardımcı oluyor