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-venvkomutuyla kurun; her Python sürümü için ayrı paket olabilir, örneğinpython3.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 CurrentUserkomutuyla script çalıştırma iznini verin
- “pip komutu bulunamıyor”:
python3 -m pipşeklinde kullanın ya dapython3 -m ensurepip --upgradeile pip’i kurun
- Sanal ortam içinde yanlış Python:
which pythonile 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-dirdeneyin 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.
