pip, venv ve Paket Yönetimi
Python'ın gücü sadece standart kütüphanesinde değil — yüz binlerce üçüncü parti paket bu gücü katbekat artırıyor. Web geliştirme, veri bilimi, yapay zeka, otomasyon — ne yapmak istersen bunun için bir paket var. Bu derste paketleri nasıl yükleyeceğini, yöneteceğini ve projelerini nasıl izole edeceğini öğreneceğiz.
pip Nedir?
pip, Python'ın paket yöneticisidir (Package Installer for Python). PyPI (Python Package Index) üzerindeki paketleri yükler, günceller ve kaldırır.
📦 Kargo Analojisi
pip'i bir kargo şirketi gibi düşün. İnternetten (PyPI) istediğin ürünü (paketi) sipariş edersin, kargo şirketi (pip) onu senin adresine (Python ortamına) teslim eder. Ürünü iade etmek istersen (uninstall) yine aynı şirketi ararsın. Evinde ne var diye sormak istersen (list) o da mümkün.
pip, Python 3.4'ten itibaren Python ile birlikte gelir. Ayrıca yükleme yapman gerekmez.
pip Versiyon Kontrolü
# pip versiyonunu kontrol et
pip --version
# pip 23.3.1 from /usr/lib/python3.11/site-packages (python 3.11)
# veya
python -m pip --versionpython -m pip formatını kullanmak daha güvenli — doğru Python sürümüne ait pip'i çalıştırır.
Temel pip Komutları
pip install — Paket Yükleme
# Paket yükle
pip install requests
# Belirli versiyon
pip install requests==2.31.0
# Minimum versiyon
pip install requests>=2.28.0
# Versiyon aralığı
pip install "requests>=2.28.0,<3.0.0"
# En son sürüme güncelle
pip install --upgrade requests
# veya kısaca:
pip install -U requestspip uninstall — Paket Kaldırma
# Paket kaldır
pip uninstall requests
# Onay sorar: Proceed (Y/n)?
# Onay sormadan kaldır
pip uninstall -y requestspip list — Yüklü Paketler
# Tüm yüklü paketleri listele
pip list
# Güncelleme bekleyen paketler
pip list --outdated
# Belirli formatda
pip list --format=jsonÖrnek çıktı:
Package Version
---------- -------
certifi 2023.7.22
charset-normalizer 3.3.2
idna 3.6
pip 23.3.1
requests 2.31.0
urllib3 2.1.0pip show — Paket Bilgisi
pip show requestsName: requests
Version: 2.31.0
Summary: Python HTTP for Humans.
Home-page: https://requests.readthedocs.io
Author: Kenneth Reitz
License: Apache 2.0
Location: /home/user/.local/lib/python3.11/site-packages
Requires: certifi, charset-normalizer, idna, urllib3
Required-by: Requires bağımlılıkları gösterir — requests yüklendiğinde bu paketler de otomatik yüklenir.
pip freeze — Bağımlılık Listesi
pip freezecertifi==2023.7.22
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.1.0freeze çıktısı tam versiyon numaralarıyla gelir — requirements.txt oluşturmak için ideal format.
pip search (Devre Dışı)
pip search komutu PyPI yük sorunu nedeniyle devre dışı bırakıldı. Paket aramak için [pypi.org](https://pypi.org) web sitesini kullan.
pip download — Çevrimdışı Yükleme
# Paketleri indir (yüklemeden)
pip download requests -d ./paketler/
# Çevrimdışı ortamda yükle
pip install --no-index --find-links=./paketler/ requestsBu internet erişimi olmayan sunuculara paket taşımak için kullanışlı.
pip cache — Önbellek Yönetimi
# Önbellek bilgisi
pip cache info
# Önbelleği temizle
pip cache purge
# Belirli paketi önbellekten sil
pip cache remove requestspip indirdiği paketleri önbellekte tutar. Aynı paketi tekrar yüklerken internetten indirmek yerine önbellekten alır.
requirements.txt: Bağımlılık Yönetimi
requirements.txt projenin bağımlılıklarını listeleyen bir dosyadır. Başka biri projeyi klonladığında tek komutla tüm bağımlılıkları yükleyebilir.
Oluşturma
# Mevcut ortamdaki tüm paketleri kaydet
pip freeze > requirements.txtManuel Oluşturma
# requirements.txt
# Ana bağımlılıklar
requests==2.31.0
flask==3.0.0
sqlalchemy==2.0.23
# Geliştirme araçları
pytest==7.4.3
black==23.12.0
# Minimum versiyon
numpy>=1.24.0
# Versiyon aralığı
pandas>=2.0.0,<3.0.0Yükleme
# requirements.txt'ten tüm paketleri yükle
pip install -r requirements.txt
# Birden fazla requirements dosyası
pip install -r requirements.txt -r requirements-dev.txtİyi Pratikler
Projelerde genellikle birden fazla requirements dosyası bulunur:
proje/
├── requirements.txt # Production bağımlılıkları
├── requirements-dev.txt # Geliştirme araçları
└── requirements-test.txt # Test araçları# requirements.txt (production)
flask==3.0.0
gunicorn==21.2.0
psycopg2-binary==2.9.9
# requirements-dev.txt
-r requirements.txt # Production bağımlılıklarını dahil et
black==23.12.0
flake8==7.0.0
mypy==1.8.0
# requirements-test.txt
-r requirements.txt
pytest==7.4.3
pytest-cov==4.1.0
factory-boy==3.3.0-r requirements.txt satırı diğer dosyayı dahil eder — tekrar yazmana gerek kalmaz.
Virtual Environment: Proje İzolasyonu
Problem
Diyelim ki iki projen var:
Proje A:
flask==2.0kullanıyorProje B:
flask==3.0kullanıyor
Global Python ortamına ikisini de yükleyemezsin — biri diğerinin üzerine yazılır. İşte virtual environment bu sorunu çözer.
🏠 Ev Analojisi
Virtual environment'ı her proje için ayrı bir ev gibi düşün. Global Python kurulumu bir apartman binası — tüm projeler aynı binada yaşar ve kaynakları paylaşır. Bu da komşu kavgalarına (versiyon çakışmaları) yol açar.
Virtual environment ile her projeye müstakil ev verirsin. Her evin kendi mutfağı (paketleri), kendi mobilyaları (ayarları) var. Birinin evinde değişiklik yapmak diğerini etkilemez.
Oluşturma ve Kullanma
# Proje dizinine git
cd ~/projeler/web_app
# Virtual environment oluştur
python -m venv venv
# Alternatif isimler: .venv, env, myenv
python -m venv .venvBu komut şu yapıyı oluşturur:
venv/
├── bin/ # Linux/macOS (Windows'ta Scripts/)
│ ├── activate # Ortamı aktifleştir
│ ├── pip # Bu ortamın pip'i
│ └── python # Bu ortamın Python'ı
├── lib/
│ └── python3.11/
│ └── site-packages/ # Paketler buraya yüklenir
├── include/
└── pyvenv.cfgAktifleştirme
# Linux / macOS
source venv/bin/activate
# Windows (CMD)
venv\Scripts\activate.bat
# Windows (PowerShell)
venv\Scripts\Activate.ps1Aktifleştirince terminal prompt'u değişir:
(venv) kullanici@makine:~/projeler/web_app$(venv) prefix'i aktif virtual environment'ı gösterir.
Kullanım
# Ortam aktifken pip kullan
(venv) $ pip install flask
(venv) $ pip install requests
(venv) $ pip list
# Sadece bu ortamdaki paketler listelenir
# Python çalıştır
(venv) $ python app.py
# Bağımlılıkları kaydet
(venv) $ pip freeze > requirements.txtDevre Dışı Bırakma
(venv) $ deactivate
$ # Artık global ortamdasınVirtual Environment İçinde Ne Var?
Aktif bir venv'in Python'ı global Python'dan farklıdır:
(venv) $ which python
/home/user/projeler/web_app/venv/bin/python
(venv) $ which pip
/home/user/projeler/web_app/venv/bin/pip
# Global ortamda
$ which python
/usr/bin/python3Paketler venv/lib/pythonX.X/site-packages/ dizinine yüklenir. Bu dizin sadece bu projeye aittir.
Venv Silme
Virtual environment'ı silmek çok basit — dizini sil, yeter:
rm -rf venv
# veya
rm -rf .venvKaybolacak bir şey yok — paket listesi requirements.txt'te kayıtlı. İstediğin zaman yeniden oluşturabilirsin.
VS Code ile Virtual Environment
VS Code otomatik olarak virtual environment'ı algılar. Algılamazsa:
Ctrl+Shift+P→ "Python: Select Interpreter"venv/bin/pythonveya.venv/bin/pythonseçTerminal otomatik aktifleşir
// .vscode/settings.json
{
"python.defaultInterpreterPath": ".venv/bin/python",
"python.terminal.activateEnvironment": true
}.gitignore'a Ekleme
Virtual environment dizinini asla Git'e commit'leme — sadece requirements.txt'i commit'le:
# .gitignore
venv/
.venv/
env/
ENV/
# Alternatif: tüm virtual environment pattern'leri
**/venv/
**/.venv/Başka biri projeyi klonladığında:
git clone https://github.com/user/proje.git
cd proje
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# Hazır!💡 İpucu:
.venv(nokta ile başlayan) isim kullanmak popüler — dosya gezgininde gizli kalır ve proje dizinini temiz tutar. Ayrıca.gitignore'da zaten genellikle nokta ile başlayan dizinler ignore edilir.
Versiyon Pinleme Stratejileri
Tam Pin (Exact)
flask==3.0.0
requests==2.31.0En güvenli — her ortamda aynı versiyon yüklenir. Production için önerilen.
Minimum Pin
flask>=3.0.0
requests>=2.28Belirtilen ve üstü kabul edilir. Kütüphane geliştirirken kullanışlı.
Uyumlu Sürüm (~= / Compatible Release)
flask~=3.0.0 # >=3.0.0, <3.1.0 (patch güncellemelerine izin ver)
flask~=3.0 # >=3.0, <4.0 (minor güncellemelere izin ver)Aralık
requests>=2.28.0,<3.0.0
numpy>=1.24,!=1.24.3 # 1.24.3 hariçNe Zaman Hangisi?
| Durum | Strateji | Örnek |
|---|---|---|
| Production uygulaması | Tam pin | flask==3.0.0 |
| Kütüphane/paket | Minimum veya aralık | flask>=3.0.0,<4.0 |
| Geliştirme ortamı | Uyumlu sürüm | flask~=3.0 |
⚠️ Dikkat:
pip freezeher zaman tam pin üretir. Bu production için iyi ama kütüphane yayınlarken çok kısıtlayıcı olabilir. Kütüphanelerde gevşek pinleme tercih et — kullanıcının diğer bağımlılıklarıyla çakışma olmasın.
Popüler Python Paketleri
Python ekosisteminin en çok kullanılan paketleri:
Web Geliştirme
pip install flask # Hafif web framework
pip install django # Full-stack web framework
pip install fastapi # Modern API framework (async)
pip install uvicorn # ASGI server (FastAPI ile)
pip install gunicorn # WSGI server (production)HTTP İstekleri
pip install requests # HTTP kütüphanesi (klasik)
pip install httpx # Modern HTTP (async destekli)Veri Bilimi
pip install numpy # Sayısal hesaplama
pip install pandas # Veri analizi
pip install matplotlib # Grafik çizimi
pip install scikit-learn # Makine öğrenmesi
pip install jupyter # İnteraktif notebookVeritabanı
pip install sqlalchemy # ORM
pip install psycopg2-binary # PostgreSQL
pip install pymongo # MongoDB
pip install redis # RedisTest ve Geliştirme
pip install pytest # Test framework
pip install black # Kod formatlayıcı
pip install flake8 # Linter
pip install mypy # Tip kontrolü
pip install pre-commit # Git hook yönetimiOtomasyon ve CLI
pip install click # CLI aracı oluşturma
pip install rich # Zengin terminal çıktısı
pip install tqdm # İlerleme çubuğu
pip install python-dotenv # .env dosyası okumaPratik: requests ile API Çağrısı
import requests
# Basit GET isteği
response = requests.get("https://api.github.com/users/python")
if response.status_code == 200:
veri = response.json()
print(f"Kullanıcı: {veri['login']}")
print(f"Repo sayısı: {veri['public_repos']}")
else:
print(f"Hata: {response.status_code}")# POST isteği
import requests
veri = {"baslik": "Yeni görev", "tamamlandi": False}
response = requests.post(
"https://jsonplaceholder.typicode.com/todos",
json=veri
)
print(response.json())pip Alternatifleri
pip dışında da paket yöneticileri var:
pipx — Uygulama Yükleyici
Global CLI araçlarını izole ortamlara yükler:
# pipx kur
pip install pipx
# CLI araçlarını global yükle (ama izole)
pipx install black
pipx install flake8
pipx install youtube-dlHer uygulama kendi virtual environment'ında çalışır — birbirlerinin bağımlılıklarını etkilemez.
pip-tools — Bağımlılık Kilitleme
pip install pip-tools# requirements.in (ana bağımlılıklar — senin yazdığın)
flask
requests
sqlalchemy# Kilitlenmiş bağımlılıkları oluştur
pip-compile requirements.in
# → requirements.txt (tüm alt bağımlılıklar dahil, pinlenmiş)
# Yükle
pip-sync requirements.txtpip-compile doğrudan bağımlılıkları (flask) ve dolaylı bağımlılıkları (werkzeug, jinja2 vb.) tek dosyada toplar.
Poetry ve PDM
Modern proje yönetimi araçları:
# Poetry
pip install poetry
poetry new myproject
poetry add flask
poetry install
# PDM
pip install pdm
pdm init
pdm add flask
pdm installBunlar pyproject.toml tabanlı çalışır ve hem bağımlılık yönetimi hem paket dağıtımı yapar. İlerideki derslerde pyproject.toml'u göreceğiz.
Tam İş Akışı: Sıfırdan Proje
Yeni bir Python projesi başlatmanın standart adımları:
# 1. Proje dizini oluştur
mkdir yeni_proje
cd yeni_proje
# 2. Virtual environment oluştur
python -m venv .venv
# 3. Aktifleştir
source .venv/bin/activate # Linux/macOS
# 4. pip'i güncelle
pip install --upgrade pip
# 5. Bağımlılıkları yükle
pip install flask requests pytest
# 6. requirements dosyalarını oluştur
pip freeze > requirements.txt
# 7. .gitignore oluştur
echo ".venv/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
# 8. Git başlat
git init
git add .
git commit -m "İlk commit"
# 9. Geliştirmeye başla!
code . # VS Code açBu adımlar her yeni projede tekrarlanır. Zamanla kas hafızası gibi otomatikleşir.
Yaygın Sorunlar ve Çözümleri
Sorun 1: "pip: command not found"
# Çözüm: python -m pip kullan
python -m pip install requests
# veya python3
python3 -m pip install requestsSorun 2: Permission Denied
# YANLIŞ — sudo ile pip kullanma (sistem Python'ını bozar)
sudo pip install requests # YAPMA!
# DOĞRU — Virtual environment kullan
python -m venv .venv
source .venv/bin/activate
pip install requests # Sorunsuz!
# veya kullanıcı dizinine yükle
pip install --user requests⚠️ Dikkat:
sudo pip installasla kullanma. Sistem Python'ının paketlerini bozar ve işletim sistemi sorunlarına yol açar. Her zaman virtual environment kullan.
Sorun 3: Versiyon Çakışması
# Bağımlılık çakışması bilgisi
pip check
# Çıktı:
# package-a 1.0 requires package-b>=2.0, but you have package-b 1.5.Çözüm: pip check çıktısına göre uyumlu versiyonları bul veya pip install --force-reinstall ile yeniden yükle.
Sorun 4: Yanlış Python Sürümü
# Hangi Python'a yüklüyorum?
which python
which pip
# Doğru eşleşme kontrolü
python --version # Python 3.11.5
pip --version # pip 23.3 from ... (python 3.11)
# Her zaman emin olmak için
python3.11 -m pip install requestsSorun 5: SSL/TLS Hatası
# Kurumsal ağlarda proxy sorunu
pip install --trusted-host pypi.org --trusted-host pypi.python.org requests
# Proxy ayarla
pip install --proxy http://proxy.sirket.com:8080 requestspip.conf: Global Ayarlar
Sürekli aynı parametreleri yazmak yerine pip.conf ile varsayılanları ayarlayabilirsin:
# Linux: ~/.config/pip/pip.conf
# Windows: %APPDATA%\pip\pip.ini
[global]
timeout = 60
index-url = https://pypi.org/simple
[install]
trusted-host = pypi.orgPratik: Bağımlılık Analizi
# deps_analyzer.py — Proje bağımlılıklarını analiz et
"""Yüklü paketleri analiz eder."""
import subprocess
import json
def bagimliliklari_analiz_et():
"""Yüklü paketlerin bağımlılık ağacını analiz eder."""
# pip list'i JSON olarak al
sonuc = subprocess.run(
["pip", "list", "--format=json"],
capture_output=True, text=True
)
paketler = json.loads(sonuc.stdout)
print(f"📦 Toplam {len(paketler)} paket yüklü\n")
# Güncellemesi olan paketler
sonuc_outdated = subprocess.run(
["pip", "list", "--outdated", "--format=json"],
capture_output=True, text=True
)
eski_paketler = json.loads(sonuc_outdated.stdout)
if eski_paketler:
print(f"⚠️ {len(eski_paketler)} paket güncel değil:")
for p in eski_paketler:
print(f" {p['name']}: {p['version']} → {p['latest_version']}")
else:
print("✅ Tüm paketler güncel!")
if __name__ == "__main__":
bagimliliklari_analiz_et()Özet
Bu derste Python paket yönetimini ve proje izolasyonunu öğrendik:
pip Python'ın paket yöneticisidir.
pip install paketile yükle,pip uninstallile kaldır,pip listile listele,pip freezeile bağımlılıkları dışa aktar.requirements.txt projenin bağımlılıklarını tanımlar.
pip freeze > requirements.txtile oluştur,pip install -r requirements.txtile yükle. Production'da tam versiyon pinleme (==) kullan.Virtual environment her projeyi izole eder — farklı projelerde farklı paket versiyonları kullanabilirsin.
python -m venv .venvile oluştur,source .venv/bin/activateile aktifleştir,deactivateile çık..gitignore'a virtual environment dizinini ekle —
venv/veya.venv/commit'lenmemel. Başkalarırequirements.txt'ten yükler.Versiyon pinleme stratejileri: Tam pin (
==) production için, minimum pin (>=) kütüphaneler için, uyumlu sürüm (~=) esnek geliştirme için.Popüler paketler:
requests(HTTP),flask/django(web),numpy/pandas(veri bilimi),pytest(test),black(formatlama). İhtiyacına göre doğru aracı seç.
AI Asistan
Sorularını yanıtlamaya hazır