İçeriğe geç
Muslu Yüksektepe

getlibs

Python projesindeki import satırlarını inceleyip yerel modülleri, standart kütüphaneyi ve pip paketlerini ayıran bağımlılık analiz aracı.

getlibs, bir Python projesindeki bütün import satırlarını tarayıp her modülün nereden geldiğini bulan bir bağımlılık analiz aracı. Bir modülün projenin kendi dosyası mı, Python'un standart kütüphanesinin bir parçası mı, yoksa pip ile kurulmuş bir üçüncü parti paket mi olduğunu ayırıyor. Hiçbir yerde bulunamayan importları da ayrıca işaretliyor. Aracı 2026 yılının başında yazdım ve PyPI'da yayınladım.

Amaç

Yıllar içinde büyüyen bir Python projesini başka bir sunucuya taşırken ya da yeni bir ortamda ayağa kaldırırken en çok vakit kaybettiğim konu, projenin gerçekte hangi paketlere ihtiyaç duyduğunu bilmemekti. Çoğu projede requirements.txt dosyası ya hiç yoktu ya da güncelliğini çoktan yitirmişti. pip freeze komutu ortamda kurulu olan her şeyi listelediği için projenin kullanmadığı paketler de dosyaya giriyordu. getlibs'i bu sorunu çözmek için geliştirdim. Mevcut bir projeden yalnızca gerçekten kullanılan paketleri içeren bir requirements.txt üretmek, CI/CD (sürekli entegrasyon ve dağıtım) hatlarında bağımlılıkları denetlemek ve farklı Python sürümleri arasında uyumluluğu kontrol etmek aracın üç temel hedefi.

Nasıl çalışır

Araç işe hedef Python yorumlayıcısını yoklayarak başlıyor. Bunun için o yorumlayıcıda küçük bir betik çalıştırıyor ve üç bilgi topluyor. Birincisi standart kütüphanedeki modüllerin listesi. Bunu yeni Python sürümlerinde sys.stdlib_module_names, eski sürümlerde ise sys.builtin_module_names üzerinden alıyor. İkincisi ortamda kurulu olan paketler ve sürümleri. Üçüncüsü de her paketin top_level.txt dosyasından okunan import adı ile pip paket adı arasındaki eşleşme. Bu eşleşme önemli, çünkü bir paketin kurulurken kullanılan adı ile kodda import edilen adı çoğu zaman farklı oluyor.

Ardından proje dizinindeki bütün .py dosyalarını ve __init__.py içeren klasörleri dolaşıp yerel modüllerin listesini çıkarıyor. Her Python dosyasını Python'un kendi ast modülüyle ayrıştırıyor. AST (soyut sözdizimi ağacı), kodun derleyicinin gördüğü yapısal hâli demek. Bu sayede yorum satırlarındaki ya da metin içindeki "import" kelimeleri yanlışlıkla sayılmıyor; yalnızca gerçek import ve from ... import ifadeleri değerlendiriliyor.

Bulunan her import için sırayla kontrol yapıyor. Önce yerel modüllere, sonra standart kütüphaneye, en son da kurulu paketlere bakıyor. Hiçbirinde bulunamayan importlar "bilinmiyor" olarak raporlanıyor.

Öne çıkan özellikler

  • İmportları düzenli ifadelerle değil, kodun sözdizimi ağacı üzerinden okuyor.
  • Import adını doğru pip paketiyle eşleştirmek için paketlerin top_level.txt bilgisini kullanıyor.
  • Analizi --python-exec parametresiyle belirtilen hedef yorumlayıcı üzerinden yaptığı için aracı çalıştırdığım ortam ile projenin çalışacağı ortam arasındaki farklar sonucu bozmuyor.
  • Her dosya için yerel, standart kütüphane, üçüncü parti ve bilinmeyen importları ayrı ayrı gösteriyor.
  • Üçüncü parti paketleri kurulu sürüm numaralarıyla birlikte listeliyor.

Çıktılar

Her çalıştırmada tarih ve saat damgalı bir rapor klasörü oluşturuluyor ve içine dört dosya yazılıyor. İlki dosya dosya ayrıntılı bir Markdown raporu. İkincisi CI hatlarında okunabilecek bir JSON raporu. Üçüncüsü yalnızca projede kullanılan paketleri sürümleriyle içeren bir requirements.txt dosyası. Dördüncüsü de ortamda kurulu tüm paketleri kapsayan bir constraints.txt dosyası.

Teknik altyapı

getlibs tamamen Python standart kütüphanesiyle yazıldı ve hiçbir dış bağımlılığı yok. Kod çözümlemesi için ast, hedef yorumlayıcıyı çalıştırmak için subprocess, paket bilgilerini okumak için importlib.metadata, komut satırı parametreleri için de argparse kullanırım. Paket pyproject.toml ile setuptools üzerinden derleniyor, Python 3.9 ve üzerini destekliyor ve MIT lisansıyla dağıtılıyor. Kurulumdan sonra getlibs adlı bir komut satırı aracı sisteme ekleniyor. Proje dizinine geçip getlibs --project-dir . --python-exec python3.13 komutunu çalıştırmak yeterli.

Kullanım alanları

  • Bağımlılık listesi olmayan eski bir projenin requirements.txt dosyasını sıfırdan çıkarmak için kullanırım.
  • Bir projeyi yeni bir Python sürümüne taşımadan önce hangi paketlerin o sürümde kurulu olmadığını görmek için hedef yorumlayıcıyla çalıştırırım.
  • JSON çıktısı sayesinde CI hattında eksik ya da tanınmayan bir import olduğunda bunu fark etmek mümkün oluyor.
  • Devraldığım bir projede hangi dosyanın hangi dış paketlere bağlı olduğunu hızlıca görmek için ayrıntılı raporu okurum.
Kategori
Geliştirici araçları
Yıl
2026

Teknolojiler

  • Python
  • PyPI
  • CI/CD
  • Open Source

Bağlantılar

  • GitHub https://github.com/muslu/getlibs
  • PyPI https://pypi.org/project/getlibs/

Tüm projelere dön