---
title: 'Sanal Ortamlar'
source: 'https://academia.sh/tr/kurslar/python-projeleri/sanal-ortamlar'
course: 'Python Projeleri: Paketleme ve Test'
language: tr
updated: '2026-08-17T18:10:31+00:00'
license: 'CC BY-SA 4.0'
---

# Sanal Ortamlar

Aynı çözümleme paylaşılan bir sitede altı kurulum sırasında beş ayrı sonuç verir ve proje kendi çözdüğü kümeyi altı sıranın yalnız ikisinde görür; yalıtılmış sitede sayı bire iner ve altı sıranın altısında aynı küme kurulur.

Önceki kurs on ders boyunca süre yerine adım saydı ve kapanışında bir cümle bıraktı:
ölçmek bir disiplindir; paketlemek ve sınamak da öyle. O kursun sorusu ölçümün **neyi
saydığıydı** — kurulum sayıma dahil mi, sınır nereye çekildi, birim hangi adla yazıldı.

Bu kursun sorusu bir adım geriye gider. Bir sayının sınırını yazmadan önce yanıtlanması
gereken daha temel bir soru vardır: **aynı girdi her seferinde aynı sonucu veriyor mu?**
Bir ölçüm iki koşumda iki ayrı değer veriyorsa, sınırını ne kadar iyi yazarsanız yazın
karşılaştırılamaz. Bu kurs o soruyu bir projenin üç ayrı yerinde sorar: bağımlılıklarında,
testlerinde ve yayımladığı paketinde. İlk yer, kodun hangi paketlerle karşılaşacağını
belirleyen yerdir.

## Kursun Ölçüsü: Ayrı Sonuç

Bir projenin sayısı çalışıp çalışmadığı değildir. Çalışan bir proje, ikinci makinede
çalışmayabilir ve bu ikinci sonuç birinciyi geçersiz kılmaz — ikisi birden doğrudur, tıpkı
önceki kursun altı bildirimi gibi. Sayılabilir olan şey şudur: **aynı girdi kaç ayrı sonuç
verdi?**

Kursun ölçü adı **ayrı sonuç (distinct outcome)**. Bir kurulumun sonucu, kurulan
sürümlerin kümesidir; iki kurulum aynı kümeyi verdiyse tek sonuç sayılır, ayrı küme
verdiyse iki. Bir sayının iki koşumda değişmemesi ise **yeniden üretilebilirlik
(reproducibility)** olarak anılır ve bu kursun bütün ölçümleri onu arar.

Kurgu üç paketten oluşur: `olcum`, `rapor` ve `ortak`. Her birinin depoda yayımlanmış
sürümleri vardır, ve proje bunları bir **bağımlılık bildirimi (dependency declaration)**
ile ister: kabul edilen en küçük ve en büyük sürüm, üst sınır dahil değil. Bildirim bir
sürüm söylemez, bir aralık söyler — bu ayrım sonraki dersin konusudur.

Bu kursun hiçbir dersi araç adı yazmaz. Sanal ortam aracı,
**paket yöneticisi (package manager)**, test çerçevesi ve derleme sistemi yalnız
**sınıf adıyla** anılır; davranışları
derste **modellenir** ve modellendiği yazılır. Standart kitaplığın parçası olan `venv` ve
`sysconfig` modülleri dilin kendisine aittir ve adlarıyla anılabilir. Ölçümde **gerçek
kurulum yapılmaz, gerçek paket indirilmez**; kurulum bir sözlüğe yazma işlemi olarak
modellenmiştir.

## Yalıtım Neyi Ayırır

**Sanal ortam (virtual environment)**, yorumlayıcının paket arayacağı yerleşimi projeye
özel kılan yalıtım sınırıdır. Kurulan paketlerin yerleştiği dizine bu derste **site**
denir; yorumlayıcı içe aktarma sırasında oraya bakar. Standart kitaplıkta `sysconfig`
modülü bu yerleşimi şema adlarıyla verir, `venv` modülü ise yeni bir yerleşim üretir.
Gerçek yol yazılmaz, çünkü yol makineye bağlıdır ve yeniden üretilemez.

Yalıtımın sağladığı şey bir gizlilik sınırı değildir. Sağladığı tek şey şudur: **aynı adlı
paket iki projede iki ayrı sürümde bulunabilir.** Tek bir site varken bu olanaksızdır,
çünkü bir ad bir yerde bir sürüme karşılık gelir.

Buradan doğrudan bir sonuç çıkar. Tek site paylaşıldığında bir projenin gördüğü sürümler
yalnız kendi bildirimine değil, **siteyi paylaşan öbür projelere ve kurulum sırasına** da
bağlıdır. Ölçülecek olan budur.

## Sınır Nerede Çizilir

Sanal ortamın ne olduğu kadar ne olmadığı da ölçümü belirler, çünkü sınırın dışında kalan
her şey ayrı sonuç üretmeye devam eder.

Bir sanal ortam **yorumlayıcıyı çoğaltmaz**; var olan bir yorumlayıcıya bağlanır ve ona
ayrı bir site verir. Ortamı kuran işlem, o yorumlayıcının içe aktarma sırasında bakacağı
yerleşimi projeye özel kılmaktan ibarettir. Etkinleştirme de bir düzenek değil, aynı şeyin
kabuk tarafındaki karşılığıdır: hangi yorumlayıcının çağrılacağı ve onun hangi siteyi
göreceği belirlenir. Standart kitaplıkta bu yerleşimin adları `sysconfig` şemalarında
durur; yeni bir yerleşim üretmek `venv` modülünün işidir.

Bunun bir sonucu doğrudan bu konunun son dersine bağlanır: yalıtım **paketleri** ayırır,
**yorumlayıcıyı** ayırmaz. Ortam hangi yorumlayıcıya bağlandıysa onunla anlamlıdır;
yorumlayıcı değiştiğinde ortamın yeniden kurulması gerekir, çünkü sitedeki paketlerin bir
bölümü o yorumlayıcı için üretilmemiş olabilir.

İkinci bir dışarıda kalan, işletim sistemi düzeyidir. Paylaşılan sistem kitaplıkları,
derleyici, ortam değişkenleri ve dosya sistemi sanal ortamın sınırının dışındadır; bir
paket bunlardan birine dayanıyorsa iki makinede iki ayrı sonuç yine mümkündür. Bu daha
geniş sınırı çizen araçlar başka bir sınıfa aittir ve bu kursun konusu değildir. Burada
ölçülen sınır tek bir düzeyde durur: **aynı makinede, aynı yorumlayıcıyla, iki projenin
paket kümesi.**

## Ortamın Yaşam Döngüsü

Kurulum akışı dört adımdır: ortam kurulur, bildirim çözümlenir, seçilen sürümler siteye
kurulur, proje o site üzerinden koşar. Dördüncü adımdan sonra ortam artık bir **yapıttır**
— üretilmiş bir sonuç, yazılmış bir kaynak değil.

Bu ayrımın pratik karşılığı nettir: ortam sürüm denetimine konmaz. Konmamasının nedeni
boyutu değil, **kaynağının başka bir yerde olmasıdır**. Ortamı yeniden üretecek olan şey
bildirimdir; ortamın kendisi o bildirimin bir koşumudur. İki koşum aynı kümeyi veriyorsa
ortamı saklamanın bir karşılığı yoktur.

Buradan bir sınama doğar. Ortamı silip aynı bildirimden yeniden kurduğunuzda kaybolan bir
şey varsa, o şey bildirime hiç yazılmamış demektir — elle kurulmuş bir paket, elle
düzeltilmiş bir sürüm, ortamın içinde biriken bir artık. Silme işlemi bu yüzden bir bakım
işi değil, **bir ölçümdür**: bildirimin eksiksiz olup olmadığını başka hiçbir şey bu kadar
doğrudan söylemez.

Ölçüm sorusunun ikinci yarısı da buradan çıkar. Ortam silinip yeniden kurulduğunda **aynı
küme** mi geliyor? Yalıtılmış bir sitede komşu ve sıra elendiğine göre geriye tek bir
değişken kalır: çözümlemenin kendisi. Bu dersin ölçümü o değişkeni sabit tutar ve yalnız
yalıtımın payını sayar.

## Paylaşılan Sitede Son Kuran Kazanır

Üç proje aynı siteyi kullanıyor. **A** bizim projemiz: bildirimini çözümleyip en yeni uygun
sürümleri seçiyor. **B** ve **C** komşu projeler; ikisi de kendi kilitleriyle geliyor, yani
kuracakları sürümler önceden yazılmış ve çözümleme yapmıyorlar. Üç projenin paket kümeleri
kısmen örtüşüyor.

Kurulumun modeldeki davranışı tek satırlıktır: bir paketi kurmak, sitedeki sürümün üzerine
yazmaktır. **Son kuran kazanır.** Bu, tek siteli bir yerleşimin kaçınılmaz davranışıdır; bir
ad bir sürüme bağlanabildiği için kuran son proje bağı kendi lehine çevirir.

A'nın çözümlemesi altı sıranın hepsinde aynıdır ve ölçümde bu ayrıca yazdırılır. Değişen
şey A'nın çözdüğü küme değil, **koşum anında gördüğü** kümedir.

Ölçümün varsayımları:

- **OB1** — Kâhin kurgunun kendisidir: depodaki sürümleri ve üç projenin isteklerini biz
  yazdık, bu yüzden her sıranın doğru sonucu ölçmeden bilinir.
- **OB2** — Depo ve bildirim ortak tanımdan birebir alınır; ders ikisini de değiştirmez.
- **OB3** — A bildirimini **en yeni uygun sürüm** stratejisiyle çözer. Strateji bu derste
  sabittir; değiştiğinde ne olduğu sonraki iki dersin konusudur.
- **OB4** — B ve C çözümleme yapmaz; kuracakları sürümler kilitlerinde yazılıdır ve
  kurgunun parçasıdır.
- **OB5** — Kurulum sitedeki sürümün üzerine yazar. Sürüm karşılaştırması ya da "zaten
  kurulu" denetimi yoktur; modelin tek kuralı son kuranın kazanmasıdır.
- **OB6** — Paylaşılan rejimde tek site vardır ve üçü de oraya kurar. Yalıtılmış rejimde
  her projenin kendi sitesi vardır.
- **OB7** — Ölçülen şey A'nın sitesinde koşum anında duran `olcum`, `ortak` ve `rapor`
  sürümleridir; öbür projelerin ne gördüğü sayılmaz.
- **OB8** — Altı sıra üç projenin bütün kurulum sıralarıdır; hiçbiri ayrıcalıklı değildir.
  Gerçek bir makinede sırayı belirleyen şey kurulumların takvimidir ve proje onu seçmez.
- **OB9** — Kurulum bir sözlüğe yazma işlemidir. **Gerçek kurulum yapılmaz, gerçek paket
  indirilmez, depoya dosya bırakılmaz.**
- **OB10** — Süre ölçülmez. Sayılan şey **ayrı sonuç** ve ayrı sonucu üreten sıra sayısıdır.
- **OB11** — Ölçüm tek koşumdur ve belirlenimcidir; kurguda rastgelelik yoktur.

## Ölçüm

```python
"""Yalitim: ayni cozumleme, ayri site; kurulum sirasi kac ayri sonuc veriyor."""
from itertools import permutations

DEPO = {
    "olcum": [(1, 0), (1, 1), (1, 2), (2, 0)],
    "rapor": [(0, 9), (1, 0), (1, 1)],
    "ortak": [(3, 0), (3, 1), (3, 2), (4, 0)],
}
BILDIRIM = {"olcum": ((1, 0), (2, 0)), "rapor": ((1, 0), (2, 0)),
            "ortak": ((3, 0), (4, 0))}

# Komsu projeler kendi kilitleriyle geliyor; ayni depoyu ayri surumlerde kullaniyorlar.
KOMSU = {"B": {"ortak": (3, 0), "rapor": (1, 0)},
         "C": {"olcum": (1, 1), "ortak": (3, 1)}}
PAKETLER = ("olcum", "ortak", "rapor")


def uygun(paket):
    alt, ust = BILDIRIM[paket]
    return [s for s in DEPO[paket] if alt <= s < ust]


def coz(strateji="en yeni"):
    secim = {}
    for paket in sorted(BILDIRIM):
        adaylar = uygun(paket)
        secim[paket] = adaylar[-1] if strateji == "en yeni" else adaylar[0]
    return secim


def yaz(site, secim):
    """Kurulum sitedeki surumun uzerine yazar: son kuran kazanir."""
    site.update(secim)
    return site


def secimi(ad):
    return coz() if ad == "A" else KOMSU[ad]


def paylasilan(sira):
    site = {}
    for ad in sira:
        yaz(site, secimi(ad))
    return tuple(site[p] for p in PAKETLER)


def yalitilmis(sira):
    siteler = {"A": {}, "B": {}, "C": {}}
    for ad in sira:
        yaz(siteler[ad], secimi(ad))
    return tuple(siteler["A"][p] for p in PAKETLER)


def yazim(goru):
    return " / ".join(".".join(map(str, s)) for s in goru)


SIRALAR = list(permutations(("A", "B", "C")))
BEKLENEN = tuple(coz()[p] for p in PAKETLER)

print(f"{'kurulum sırası':<16s} {'paylaşılan sitede A':>21s} {'yalıtılmış sitede A':>21s}")
p_goru, y_goru = [], []
for sira in SIRALAR:
    a, b = paylasilan(sira), yalitilmis(sira)
    p_goru.append(a)
    y_goru.append(b)
    print(f"{' '.join(sira):<16s} {yazim(a):>21s} {yazim(b):>21s}")

print(f"\nA'nın çözümlemesi altı sıranın hepsinde {yazim(BEKLENEN)}")
print(f"altı kurulum sırası, paylaşılan sitede {len(set(p_goru))} ayrı sonuç, "
      f"yalıtılmış sitede {len(set(y_goru))}")
print(f"çözdüğü kümeyi gören sıra: paylaşılan {p_goru.count(BEKLENEN)}/{len(SIRALAR)}, "
      f"yalıtılmış {y_goru.count(BEKLENEN)}/{len(SIRALAR)}")
```

```
kurulum sırası     paylaşılan sitede A   yalıtılmış sitede A
A B C                  1.1 / 3.1 / 1.0       1.2 / 3.2 / 1.1
A C B                  1.1 / 3.0 / 1.0       1.2 / 3.2 / 1.1
B A C                  1.1 / 3.1 / 1.1       1.2 / 3.2 / 1.1
B C A                  1.2 / 3.2 / 1.1       1.2 / 3.2 / 1.1
C A B                  1.2 / 3.0 / 1.0       1.2 / 3.2 / 1.1
C B A                  1.2 / 3.2 / 1.1       1.2 / 3.2 / 1.1

A'nın çözümlemesi altı sıranın hepsinde 1.2 / 3.2 / 1.1
altı kurulum sırası, paylaşılan sitede 5 ayrı sonuç, yalıtılmış sitede 1
çözdüğü kümeyi gören sıra: paylaşılan 2/6, yalıtılmış 6/6
```

## Altı Sıra, Beş Sonuç

Sol sütun altı satırda beş ayrı küme veriyor. Yalnız iki sıra aynı sonucu üretiyor
(`B C A` ile `C B A`), ve ikisinin ortak özelliği A'nın **son** kurmuş olmasıdır. Kalan
dört sıranın her biri kendi kümesini veriyor.

İlk satır uç durumu veriyor. `A B C` sırasında A önce kuruyor ve üç paketini de kendi
seçtiği sürümlerle yazıyor; sonra B `ortak` ile `rapor` üzerine, sonra C `olcum` ile
`ortak` üzerine yazıyor. Sonuçta A'nın gördüğü üç sürümün **üçü de** başka projelerden
geliyor — kendi kararlarından ayakta kalan yok. `B A C` sırasında yalnız `rapor` ayakta
kalıyor, çünkü C o paketi hiç kurmuyor. `C A B` sırasında ayakta kalan tek paket `olcum`;
`ortak` ile `rapor` en son B'den geliyor.

Bu beş sonucun hiçbiri bildirimi çiğnemiyor. A'nın bildirimi `ortak` için üç sürümü de
kabul ediyor, `olcum` için üçünü de, `rapor` için ikisini de. Yani A hangi sırada kurulursa
kurulsun kabul ettiği bir sürümle karşılaşıyor ve hiçbir uyarı doğmuyor. Kusurun **sessiz**
olması buradan geliyor: bildirim bir aralık olduğu için, aralığın içindeki her sapma
meşrudur.

Beş kümeden yalnız biri A'nın kendi seçimidir. Kalan dördünü A hiç seçmedi, hiç istemedi ve
hiçbir yerde yazmadı; yine de kodu o dördünün üzerinde koştu. Bu, ayrı sonucun neden
"çalıştı" ya da "çalışmadı"dan ayrı bir ölçü olduğunu gösteriyor: altı sıranın altısında da
proje koşabilir, hiçbiri hata vermeyebilir, ve arkada beş ayrı kurulum durur.

Sağ sütun aynı altı sırayı yalıtılmış rejimde gösteriyor ve tek bir küme veriyor:
**1 ayrı sonuç**. Altı sıranın altısında A, kendi çözdüğü kümeyi görüyor.

Alt satır farkı en keskin biçimde yazıyor. Paylaşılan sitede A, çözümlemesinin sonucunu
**altı sıranın ikisinde** görüyor; yalıtılmış sitede **altısında**. Dörtte üçlük bir
sapmanın kaynağı A'nın kendi kararlarında değil, tamamen dışarıdadır.

## Yalıtımın Tekleştirmediği

Yalıtım bir şeyi çözer ve bir şeyi çözmez. Bu ayrım kursun geri kalanının çatısıdır.

**Çözdüğü:** komşu projelerin kararları ve kurulum sırası artık sonucu değiştirmiyor. Beş
ayrı sonuç bire indi ve indiren şey daha iyi bir çözümleme değil, **sınırın kendisi** oldu.
A'nın çözümlemesi ölçümün başında da sonunda da aynıydı; değişen, çözümlemenin sonucunun
korunup korunmadığıydı.

**Çözmediği:** A'nın çözümlemesinin **kendisi**. Yalıtılmış sitede bile kurulan küme, o
çözümlemenin hangi kuralla yapıldığına bağlıdır. Ölçümde bu kural sabit tutuldu — en yeni
uygun sürüm — ve bu yüzden sağ sütun tek bir küme verdi. Kural değişseydi sağ sütun da
değişirdi, çünkü bildirim bir sürüm değil bir aralık söylüyor.

İkinci sınır daha da dışarıdadır: aynı bildirim, depo değiştiğinde de ayrı bir küme
verebilir. Bugün en yeni olan sürüm yarın en yeni olmayabilir ve bildirim yeni olanı da
kabul eder. Yalıtım bu ikisine karşı hiçbir şey yapmaz; sınır, sitenin duvarında biter.

Bir sanal ortam bu yüzden **yeniden üretilebilirliğin tamamı değil, ilk koşuludur.** Sınırı
çizmek, sınırın içinde ne olacağına karar vermekle aynı şey değildir.

## Özet

- Kursun ölçüsü **ayrı sonuçtur**: bir projenin sayısı çalışıp çalışmadığı değil, aynı
  girdinin kaç ayrı sonuç verdiğidir.
- **Sanal ortam** bir yalıtım sınırıdır; sağladığı tek şey aynı adlı paketin iki projede iki
  ayrı sürümde bulunabilmesidir.
- Tek site paylaşıldığında kurulum sırası sonucu belirler: altı sıra **5 ayrı sonuç** verir
  ve proje kendi çözdüğü kümeyi yalnız **2/6** sırada görür.
- Yalıtılmış sitede aynı altı sıra **1 ayrı sonuç** verir ve proje kümesini **6/6** sırada
  görür; A'nın çözümlemesi iki rejimde de aynıdır, korunan şey çözümlemenin **sonucudur**.
- Beş sonucun hiçbiri bildirimi çiğnemez; bildirim bir aralık olduğu için aralık içindeki
  sapma sessizdir ve uyarı üretmez.
- Yalıtım komşuyu ve sırayı eler, ama çözümlemenin kendi kuralını ve deponun zaman içinde
  değişmesini elemez.

## Sonraki Adım

Yalıtılmış sitedeki tek sonuç, ölçümde bir kuralın sabit tutulmasıyla elde edildi: en yeni
uygun sürüm. O kural bir seçimdi ve başka seçimler de bildirime uygundur. Sonraki ders
sınırın içine bakar ve aynı soruyu bir kez daha sorar: **aynı bildirim, tek başına kaç ayrı
sürüm kümesi belirtiyor?** Ölçüm iki kuralı yan yana koyar, çıkan sayıyı bir dosyaya
yazdırır, ve o dosyanın çözümlemeyi ortadan kaldırıp kaldırmadığını sınar.
