← Kursa Dön
📄 Text · 15 min

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 --version

python -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 requests

pip uninstall — Paket Kaldırma

# Paket kaldır
pip uninstall requests
# Onay sorar: Proceed (Y/n)?

# Onay sormadan kaldır
pip uninstall -y requests

pip 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.0

pip show — Paket Bilgisi

pip show requests
Name: 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 freeze
certifi==2023.7.22
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.1.0

freeze çı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/ requests

Bu 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 requests

pip 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.txt

Manuel 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.0

Yü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.0 kullanıyor

  • Proje B: flask==3.0 kullanı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 .venv

Bu 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.cfg

Aktifleştirme

# Linux / macOS
source venv/bin/activate

# Windows (CMD)
venv\Scripts\activate.bat

# Windows (PowerShell)
venv\Scripts\Activate.ps1

Aktifleş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.txt

Devre Dışı Bırakma

(venv) $ deactivate
$ # Artık global ortamdasın

Virtual 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/python3

Paketler 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 .venv

Kaybolacak 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:

  1. Ctrl+Shift+P → "Python: Select Interpreter"

  2. venv/bin/python veya .venv/bin/python seç

  3. 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.0

En güvenli — her ortamda aynı versiyon yüklenir. Production için önerilen.

Minimum Pin

flask>=3.0.0
requests>=2.28

Belirtilen 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?

DurumStratejiÖrnek
Production uygulamasıTam pinflask==3.0.0
Kütüphane/paketMinimum veya aralıkflask>=3.0.0,<4.0
Geliştirme ortamıUyumlu sürümflask~=3.0

⚠️ Dikkat: pip freeze her 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 notebook

Veritabanı

pip install sqlalchemy     # ORM
pip install psycopg2-binary # PostgreSQL
pip install pymongo        # MongoDB
pip install redis          # Redis

Test 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önetimi

Otomasyon 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ı okuma

Pratik: 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-dl

Her 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.txt

pip-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 install

Bunlar 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 requests

Sorun 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 install asla 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 requests

Sorun 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 requests

pip.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.org

Pratik: 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 paket ile yükle, pip uninstall ile kaldır, pip list ile listele, pip freeze ile bağımlılıkları dışa aktar.

  • requirements.txt projenin bağımlılıklarını tanımlar. pip freeze > requirements.txt ile oluştur, pip install -r requirements.txt ile yükle. Production'da tam versiyon pinleme (==) kullan.

  • Virtual environment her projeyi izole eder — farklı projelerde farklı paket versiyonları kullanabilirsin. python -m venv .venv ile oluştur, source .venv/bin/activate ile aktifleştir, deactivate ile çı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ç.