venv ile Python Sanal Ortam Oluşturma ve Yönetimi

Python projelerinde bağımlılık yönetimi, deneyimli geliştiricilerin bile başını ağrıtan konulardan biridir. Bir projede Django 3.2 kullanırken diğerinde Django 4.2 kullanmanız gerekiyorsa, ya da bir projenin requests 2.28 sürümüne ihtiyacı varken diğerinin 2.31 sürümüne bağımlıysa, sistem genelinde kurulu tek bir Python ortamı bu durumu kaldıramaz. İşte tam da bu noktada venv modülü devreye giriyor.

venv Nedir ve Neden Kullanmalısınız?

venv, Python 3.3 ile birlikte standart kütüphaneye dahil edilen bir modüldür. Ayrıca herhangi bir şey kurmanız gerekmez; Python 3 kuruluysa venv de hazırdır. Her proje için izole, bağımsız bir Python ortamı oluşturmanıza olanak tanır.

Sanal ortam olmadan çalıştığınızda şu sorunlarla karşılaşırsınız:

  • Versiyon çakışmaları: Farklı projeler aynı paketin farklı sürümlerine ihtiyaç duyar
  • Sistem Python’unun kirlenmesi: Pip ile yüklediğiniz her paket sistem genelinde kurulur
  • Tekrar üretilebilirlik problemi: “Bende çalışıyor” sendromu, başka bir makinede ya da sunucuda aynı ortamı oluşturamamaktan kaynaklanır
  • İzin sorunları: Linux’ta sistem Python’una paket kurmak için root yetkisi gerekebilir

Gerçek dünyada şöyle bir senaryo düşünün: Bir web scraping projesi için beautifulsoup4==4.9.3 kullanıyorsunuz. Bir süre sonra yeni bir proje başlıyorsunuz ve bu sefer beautifulsoup4==4.12.0 kullanmak istiyorsunuz. Sistem genelinde sadece bir sürüm kurulu olabilir. Sanal ortamlarla her projenin kendi paket seti olur ve bu çakışma tamamen ortadan kalkar.

Python ve pip Sürümünü Kontrol Etmek

İşe başlamadan önce sisteminizde Python’un kurulu olduğunu doğrulayalım:

# Python sürümünü kontrol et
python3 --version

# pip sürümünü kontrol et
pip3 --version

# venv modülünün mevcut olup olmadığını kontrol et
python3 -m venv --version

Eğer Ubuntu veya Debian tabanlı bir sistemdeyseniz ve venv modülü eksikse:

# Debian/Ubuntu
sudo apt update
sudo apt install python3-venv python3-pip

# RHEL/CentOS/Rocky Linux
sudo dnf install python3 python3-pip

Windows’ta Python resmi sitesinden kurulum yapıldıysa venv zaten gelir. Sadece py veya python komutunu kullanmanız yeterlidir.

Sanal Ortam Oluşturmak

Temel kullanım oldukça basittir. Proje dizininize gidip şu komutu çalıştırırsınız:

# Proje dizini oluştur ve gir
mkdir myproject
cd myproject

# Sanal ortam oluştur
python3 -m venv venv

# Ya da farklı bir isim verebilirsiniz
python3 -m venv .venv
python3 -m venv env

Burada venv hem modül adı hem de oluşturulan dizinin adıdır. Konvansiyonel olarak .venv veya venv ismi kullanılır. .venv (noktalı) kullanmak, dizini gizli yapar ve ls komutunda görünmez; dağınıklığı azaltır. Ben genellikle .venv tercih ederim çünkü proje dizininde arama yaparken bu dizinin içine girmek istemezsiniz.

venv komutu şu seçenekleri destekler:

  • –system-site-packages: Sistem genelindeki paketlere sanal ortamdan erişim sağlar
  • –without-pip: pip kurulumu olmadan ortam oluşturur
  • –copies: Sembolik bağlantı yerine dosyaları kopyalar (taşınabilirlik için)
  • –clear: Varolan dizini temizleyerek yeniden oluşturur
  • –upgrade: Python yorumlayıcısını yeni sürümle günceller
  • –prompt: Aktivasyon sırasında görünecek prompt adını özelleştirir

Belirli bir Python sürümüyle sanal ortam oluşturmak istiyorsanız:

# Python 3.10 ile sanal ortam oluştur
python3.10 -m venv .venv

# Python 3.11 ile
python3.11 -m venv .venv

# Hangi Python yorumlayıcısının kullanıldığını doğrula
.venv/bin/python --version

Sanal Ortamı Aktive ve Deaktive Etmek

Sanal ortamı oluşturduktan sonra aktive etmeniz gerekir. Aktive etmeden, terminaldeki python ve pip komutları hala sistem genelindeki yorumlayıcıyı kullanır.

# Linux/macOS - bash/zsh
source .venv/bin/activate

# Linux/macOS - fish shell
source .venv/bin/activate.fish

# Windows - Command Prompt
.venvScriptsactivate.bat

# Windows - PowerShell
.venvScriptsActivate.ps1

# Aktivasyonu doğrula - prompt değişmeli
# (.venv) user@hostname:~/myproject$

# Hangi Python kullanıldığını kontrol et
which python
# Çıktı: /home/user/myproject/.venv/bin/python

# Deaktive etmek
deactivate

Aktivasyon sonrası terminalinizin başında (.venv) ya da verdiğiniz isim görünür. Bu görsel ipucu, hangi ortamda çalıştığınızı her zaman bilmenizi sağlar. Birden fazla terminal penceresi açık tuttuğunuzda bu ipucu hayat kurtarıcı olabilir.

Paket Kurulumu ve Yönetimi

Ortam aktive edildiğinde pip komutları artık yalnızca bu ortamı etkiler:

# Aktif ortamda paket kur
pip install requests
pip install django==4.2.7
pip install "flask>=2.0,<3.0"

# Yüklü paketleri listele
pip list

# Belirli bir paketin detaylarını gör
pip show requests

# Paket güncelle
pip install --upgrade requests

# Paket kaldır
pip uninstall requests

# Gereksiz bağımlılıkları bul
pip check

Burada dikkat edilmesi gereken bir nokta: pip install yaparken sanal ortamın aktive edilmiş olması şart. Aksi halde sistem Python’una kurulum yaparsınız ve amacınızın tam tersi olur. Bunu önlemek için bir alışkanlık geliştirin; terminale her oturduğunuzda önce proje dizinine geçin, sonra source .venv/bin/activate komutunu çalıştırın.

requirements.txt ile Bağımlılık Yönetimi

Projenizin bağımlılıklarını kayıt altına almak ve başka bir ortamda birebir aynı kurulumu yapabilmek için requirements.txt dosyası kullanılır:

# Aktif ortamdaki tüm paketleri dışa aktar
pip freeze > requirements.txt

# requirements.txt içeriğini görüntüle
cat requirements.txt

# Başka bir ortamda aynı paketleri kur
pip install -r requirements.txt

# Geliştirme ve production için ayrı dosyalar
pip install -r requirements-dev.txt
pip install -r requirements-prod.txt

Gerçek dünyada tek bir requirements.txt yerine birden fazla dosya kullanmak iyi bir pratiktir. Örneğin:

  • requirements.txt: Temel production bağımlılıkları
  • requirements-dev.txt: Geliştirme araçları (pytest, black, flake8 vb.)
  • requirements-test.txt: Sadece test için gereken paketler

requirements-dev.txt dosyası şöyle görünebilir:

# requirements-dev.txt içeriği
# Production bağımlılıklarını dahil et
-r requirements.txt

# Geliştirme araçları
pytest==7.4.3
black==23.11.0
flake8==6.1.0
mypy==1.7.1
ipython==8.17.2

Bir uyarı: pip freeze tüm bağımlılıkları ve alt bağımlılıkları sürümleriyle birlikte listeler. Bu production için iyi olsa da bazen aşırı kısıtlayıcı olabilir. Bu durumda pip-tools gibi araçlara bakabilirsiniz, ancak temel kullanım için pip freeze yeterlidir.

Gerçek Dünya Senaryosu: Django Projesi Kurulumu

Bir Django web uygulaması geliştirdiğinizi düşünelim. Geliştirme, test ve production ortamları farklı konfigürasyonlar gerektirir:

# Proje yapısını oluştur
mkdir django-webapp
cd django-webapp

# Sanal ortam oluştur
python3 -m venv .venv
source .venv/bin/activate

# Temel bağımlılıkları kur
pip install django==4.2.7 psycopg2-binary==2.9.9 gunicorn==21.2.0 python-decouple==3.8

# Geliştirme araçlarını kur
pip install django-debug-toolbar==4.2.0 pytest-django==4.7.0 factory-boy==3.3.0

# Bağımlılıkları kaydet
pip freeze | grep -v "^-e" > requirements.txt

# Django projesi başlat
django-admin startproject webapp .

# .gitignore oluştur - sanal ortam dizinini ekle
echo ".venv/" >> .gitignore
echo "__pycache__/" >> .gitignore
echo "*.pyc" >> .gitignore
echo ".env" >> .gitignore

Bu noktada .gitignore dosyasına .venv/ eklemek kritik önemdedir. Sanal ortam dizinini Git’e commit etmek istemezsiniz; binlerce dosya ve onlarca megabyte gereksiz yere repoya girer. Bunun yerine requirements.txt dosyasını commit edersiniz ve projeyi alan herkes kendi sanal ortamını oluşturur.

Sanal Ortam Taşıma ve Paylaşma

Sanal ortam dizinini direkt kopyalayarak taşımak genellikle çalışmaz çünkü içindeki dosyalar mutlak yollara referans verir. Doğru yöntem şudur:

# Kaynak makinede
source .venv/bin/activate
pip freeze > requirements.txt
deactivate

# Hedef makinede
git clone https://github.com/username/myproject.git
cd myproject
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# Kurulumu doğrula
python -c "import django; print(django.__version__)"

CI/CD pipeline’larında da aynı yaklaşım kullanılır. GitHub Actions için örnek:

# Bu bir shell scripti olarak düşünün - GitHub Actions workflow adımları
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
pytest tests/

Birden Fazla Python Sürümüyle Çalışmak

Sistemde birden fazla Python sürümü kuruluysa, venv ile istediğiniz sürümü seçebilirsiniz. Bu özellikle legacy projeleri maintain ederken ya da yeni sürüme geçiş testleri yaparken işe yarar:

# Sistemdeki Python sürümlerini listele
ls /usr/bin/python*
# ya da
ls /usr/local/bin/python*

# Python 3.9 ile ortam oluştur (eski proje için)
python3.9 -m venv .venv-py39

# Python 3.12 ile ortam oluştur (yeni proje için)
python3.12 -m venv .venv-py312

# Sürümleri doğrula
.venv-py39/bin/python --version
.venv-py312/bin/python --version

Ubuntu’da birden fazla Python sürümü kurmak için:

# deadsnakes PPA ekle
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update

# Farklı Python sürümleri kur
sudo apt install python3.9 python3.9-venv
sudo apt install python3.12 python3.12-venv

Sanal Ortamı Yönetmek: Güncelleme ve Silme

Bir sanal ortamı güncellemek ya da sıfırlamak gerektiğinde şu adımları izleyin:

# pip'i güncelle (her yeni ortamda yapılması önerilir)
pip install --upgrade pip

# Tüm paketleri güncelle
pip list --outdated
pip install --upgrade $(pip list --outdated --format=columns | tail -n +3 | awk '{print $1}')

# Sanal ortamı tamamen silmek
deactivate
rm -rf .venv

# Yeniden oluştur
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# Belirli paketleri requirements.txt olmadan temizlemek
pip freeze | xargs pip uninstall -y

Shell Kısayolları ve Otomasyon

Sık kullanılan komutları kısaltmak için .bashrc veya .zshrc dosyanıza alias’lar ekleyebilirsiniz:

# ~/.bashrc veya ~/.zshrc dosyasına ekle

# Sanal ortam oluştur ve aktive et
alias venv-create='python3 -m venv .venv && source .venv/bin/activate && pip install --upgrade pip'

# Mevcut ortamı aktive et
alias va='source .venv/bin/activate'

# Deaktive et
alias vd='deactivate'

# requirements.txt güncelle
alias pipreq='pip freeze > requirements.txt'

# Bağımlılıkları kur
alias pipinstall='pip install -r requirements.txt'

# Değişiklikleri uygulamak için
source ~/.bashrc

Bir adım daha ileri giderek, proje dizinine her girişte otomatik olarak sanal ortamı aktive etmek için direnv aracını kullanabilirsiniz. Ancak bu başka bir yazının konusu olabilir.

.gitignore ile Sanal Ortamı Dışarıda Tutmak

Git kullanıyorsanız sanal ortam dizinini her zaman .gitignore‘a ekleyin. GitHub’ın Python için hazırladığı .gitignore şablonu zaten bu kısımları içerir ama manuel oluştururken unutulabiliyor:

# .gitignore dosyasına eklenecekler
.venv/
venv/
env/
ENV/
.env/

# Derleme ve cache dosyaları
__pycache__/
*.py[cod]
*$py.class
*.egg-info/
dist/
build/

# Ortam değişkenleri dosyası
.env
.env.local

Eğer yanlışlıkla commit ettiyseniz:

# Git cache'den kaldır
git rm -r --cached .venv/
git commit -m "Remove venv from tracking"

Yaygın Sorunlar ve Çözümleri

Sysadmin olarak karşılaşacağınız sorunlar ve çözümleri:

  • “python3-venv paketi eksik” hatası: sudo apt install python3-venv komutuyla kurun; her Python sürümü için ayrı paket olabilir, örneğin python3.11-venv
  • “Permission denied” hatası: Sanal ortamı root ile oluşturmayın; kendi kullanıcınızla çalışın
  • Windows PowerShell aktivasyon hatası: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser komutuyla script çalıştırma iznini verin
  • “pip komutu bulunamıyor”: python3 -m pip şeklinde kullanın ya da python3 -m ensurepip --upgrade ile pip’i kurun
  • Sanal ortam içinde yanlış Python: which python ile kontrol edin; ortam aktive değilse sistem Python’u görünür
  • requirements.txt’deki paket kurulum hatası: pip install -r requirements.txt --no-cache-dir deneyin ya da sorunlu paketi tek tek kurup sürüm uyumluluğunu kontrol edin

Sonuç

venv, Python geliştirme sürecinin vazgeçilmez bir parçasıdır. Basit ama güçlü bu araç, proje bağımlılıklarını izole etmenizi, ortamları tekrar üretilebilir hale getirmenizi ve takım çalışmasını kolaylaştırmanızı sağlar. Sistem yöneticisi perspektifinden bakıldığında, sanal ortamlar sunucudaki Python kurulumunu da korur ve farklı uygulamaların birbirini etkilemesini engeller.

Her yeni Python projesine .venv oluşturarak başlayın, requirements.txt dosyasını güncel tutun ve sanal ortam dizinini Git’e commit etmeyin. Bu üç alışkanlık, ileride yaşayacağınız bağımlılık sorunlarının büyük çoğunluğunu önleyecektir.

Daha karmaşık çok-proje senaryoları için pyenv ve poetry gibi araçlara bakabilirsiniz. Ancak çoğu kullanım senaryosu için standart kütüphanedeki venv modülü fazlasıyla yeterlidir ve ekstra bağımlılık getirmez. Sadelik de bir erdemdir.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir