Neden ayrı bir Windows dersi?
Kurulum ve araçlar dersinde Python'ı kurmayı kısaca gördün. Bu ders, o kısa anlatımın "ama bende çalışmadı" kısmıdır. Windows'ta Python kurulumu çoğu zaman beş dakika sürer; sorun çıktığında ise saatler alabilir, çünkü hata mesajı genellikle asıl nedeni söylemez. 'python' is not recognized diyen bir terminal sana "PATH ortam değişkeninde Python klasörü yok" demez. Bu derste kurulumun her ekranını, Windows'un bir komutu nasıl bulduğunu ve en sık karşılaşılan hataların gerçek nedenini öğreneceksin. Amaç ezber değil, teşhis yapabilmek: bir sonraki bilgisayarda ya da bir ekip arkadaşının ekranında sorunu iki dakikada çözmek.
Anadolu Market'in veri ekibine yeni katılan bir stajyer düşün. İlk gün kurumsal dizüstü bilgisayarına Python kuruyor, VS Code'u açıyor ve ilk betiği çalıştırınca terminal Microsoft Store'u açıyor. Bu derste o sorunun neden olduğunu ve neden tek bir ayar düğmesiyle çözüldüğünü göreceksin.
Dört kurulum yolu
| Yol | Artısı | Eksisi | Kimin için |
|---|---|---|---|
| python.org yükleyicisi | Resmî, tam denetim, py başlatıcısı gelir | Ekranları doğru işaretlemek gerekir | Çoğu kişi için önerilen yol |
| Microsoft Store | Yönetici izni istemez, otomatik güncellenir | Bazı klasörlere yazma kısıtlı, py başlatıcısı yok | Okul ya da kilitli bilgisayar |
winget | Tek komut, betikle tekrarlanabilir | Kurulum seçeneklerini görmezsin | Birden çok makine kuran, otomasyon seven |
| Anaconda/Miniconda | Bilimsel paketler hazır gelir | Büyük, kendi ortam sistemi var | Veri bilimi; Jupyter ve Colab dersinde |
python.org yükleyicisi adım adım
python.org/downloads adresinden Windows installer (64-bit) dosyasını indir (örneğin python-3.12.4-amd64.exe). "embeddable package" başka programların içine gömülmek içindir; öğrenme için değil.
- İlk ekran: en altta iki kutu var. "Use admin privileges when installing py.exe" başlatıcıyı tüm kullanıcılar için kurar (yönetici izni ister; yoksa işaretini kaldır). "Add python.exe to PATH" kutusunu mutlaka işaretle; varsayılan olarak işaretsiz gelir ve sorunların yarısı buradan çıkar.
- Install Now seçersen Python kullanıcı klasörüne kurulur:
C:\Users\ayse\AppData\Local\Programs\Python\Python312. Yönetici izni gerekmez. Yeni başlıyorsan bu yeterlidir. - Customize installation seçersen "Optional Features" ekranı gelir: pip (paket yükleyici, açık kalsın), tcl/tk and IDLE (basit editör ve tkinter), Python test suite (gerekmez), py launcher (açık kalsın), for all users (başlatıcıyı herkese kurar).
- Advanced Options ekranında: Install Python 3.12 for all users (Program Files'a kurar, yönetici ister), Associate files with Python (.py dosyasına çift tıklayınca çalışsın), Add Python to environment variables (ilk ekrandaki PATH kutusunun aynısı), Precompile standard library. Kurulum yolunu
C:\Python312gibi kısa, boşluksuz, Türkçe karaktersiz bir yere almak ileride çok baş ağrısı önler. - Son ekran: "Disable path length limit" düğmesi çıkarsa tıkla. Windows'un 260 karakterlik yol sınırını kaldırır; derin klasörlü paketlerde pip hatalarını önler.
Kurulum bitince yeni bir terminal aç (açık olan terminal eski PATH'i hatırlar) ve doğrula:
python --version py --version python -m pip --version where python
Python'a kendisini anlattırmak da mümkün. Aşağıdaki kod, hangi yorumlayıcının çalıştığını ve nereye kurulduğunu gösterir; "yanlış Python çalışıyor" şüphesinde ilk bakılacak yer burasıdır.
import sys, platform
print("Sürüm :", platform.python_version())
print("Ana / alt :", sys.version_info.major, sys.version_info.minor)
print("Yorumlayıcı:", sys.executable or "(tarayıcıda yol yok)")
print("Kurulum :", sys.prefix)
print("İşletim :", platform.system())
print("64 bit mi :", sys.maxsize > 2**32)
print("3.10+ mı :", sys.version_info >= (3, 10))
sys.version_info bir demet (tuple) gibi davranır; sys.version_info >= (3, 10) sayı sayı karşılaştırır. Sürümü metin olarak karşılaştırma: "3.9" > "3.12" ifadesi True döner çünkü metinler karakter karakter karşılaştırılır ve "9" > "1".Microsoft Store tuzağı: App execution aliases
Windows 10 ve 11, Python kurulu olmasa bile C:\Users\ayse\AppData\Local\Microsoft\WindowsApps klasörüne python.exe ve python3.exe adında küçük takma ad (alias) dosyaları koyar. Bunlar gerçek Python değildir; çalışınca Store'u açar ya da Python was not found; run without arguments to install from the Microsoft Store yazar. WindowsApps klasörü PATH'te genellikle senin Python klasöründen önce geldiği için, Python'ı kurmuş olsan bile takma ad kazanır.
Çözüm: Ayarlar → Uygulamalar → Gelişmiş uygulama ayarları → Uygulama yürütme diğer adları (App execution aliases) ekranında "Uygulama yükleyici python.exe" ve "python3.exe" satırlarını kapat. Ardından yeni terminal aç. Store sürümünü bilerek kullanıyorsan bu takma adlar gerçek Python'ı gösterir; o durumda sorun yoktur.
py başlatıcısı: birden çok sürümün trafik polisi
python.org yükleyicisi py.exe adlı bir başlatıcı (launcher) kurar. Bu küçük program PATH'e bakmaz; Windows kayıt defterindeki kurulu Python'ları bilir ve istediğin sürümü çalıştırır. PATH karıştığında en güvenilir araç budur.
| Komut | Ne yapar |
|---|---|
py | Varsayılan (genelde en yeni) Python'ı açar |
py -3.12 betik.py | Betiği özellikle 3.12 ile çalıştırır |
py --list (ya da py -0) | Kurulu sürümleri listeler; yıldızlı olan varsayılandır |
py -0p | Sürümleri dosya yollarıyla listeler |
py -3.12 -m pip install requests | Paketi tam olarak 3.12'ye kurar |
py -3.12 -m venv .venv | 3.12 tabanlı sanal ortam (virtual environment) oluşturur |
-V:3.12 * Python 3.12 (64-bit) -V:3.11 Python 3.11 (64-bit)
py --list çıktısı yukarıdaki gibidir. PY_PYTHON=3.11 ortam değişkeniyle varsayılanı değiştirebilirsin.
PATH nedir, Windows bir komutu nasıl bulur?
PATH, klasör yollarını noktalı virgülle (Windows) ayırarak tutan bir ortam değişkenidir (environment variable). Terminale python yazdığında Windows önce bulunduğun klasöre, sonra PATH'teki klasörlere soldan sağa bakar ve python.exe (ya da .bat, .cmd) bulduğu ilk klasördekini çalıştırır. Gerisine bakmaz. İki Python kuruluysa hangisinin çalışacağını PATH sırası belirler.
where python # CMD ve PowerShell: tüm eşleşmeleri sırayla gösterir $env:Path -split ';' # PowerShell: PATH'i satır satır göster echo %PATH% # CMD: PATH'i tek satırda göster Get-Command python | Format-List # PowerShell: çalışacak olanın tam yolu
PowerShell'de where yerine where.exe yazman gerekebilir; çünkü where orada Where-Object komutunun kısaltmasıdır ve sessizce hiçbir şey yazdırmaz.
path_metni = r"C:\Windows\system32;C:\Users\ayse\AppData\Local\Microsoft\WindowsApps;C:\Users\ayse\AppData\Local\Programs\Python\Python312\Scripts;C:\Users\ayse\AppData\Local\Programs\Python\Python312;;C:\Program Files\Git\cmd"
for sira, klasor in enumerate(path_metni.split(";"), start=1):
if not klasor:
print(sira, "(boş girdi)")
continue
isaret = " <-- Python" if "python" in klasor.lower() else ""
print(sira, klasor + isaret)
PATH'i kalıcı değiştirmek için Başlat menüsüne "ortam değişkenleri" yaz → Hesabınız için ortam değişkenlerini düzenleyin. Üstte kullanıcı değişkenleri, altta (yönetici gerektiren) sistem değişkenleri vardır. Windows ikisini birleştirir: önce sistem PATH'i, sonra kullanıcı PATH'i. Değişiklikten sonra açık terminaller eski değeri tutar; yeni terminal (bazen VS Code'u tamamen kapatıp açmak) gerekir.
where komutunun yaptığını Python ile taklit edelim. Gerçek bilgisayarda dosyalar diskte; burada var olan dosyaları bir küme (set) olarak veriyoruz.
import ntpath
path_klasorleri = [
r"C:\Users\ayse\AppData\Local\Microsoft\WindowsApps",
r"C:\Python312",
r"C:\Python312\Scripts",
]
diskteki_dosyalar = {
r"C:\Users\ayse\AppData\Local\Microsoft\WindowsApps\python.exe",
r"C:\Python312\python.exe",
r"C:\Python312\Scripts\pip.exe",
}
def where(komut):
bulunanlar = []
for klasor in path_klasorleri:
aday = ntpath.join(klasor, komut + ".exe")
if aday in diskteki_dosyalar:
bulunanlar.append(aday)
return bulunanlar
for komut in ["python", "pip", "git"]:
sonuc = where(komut)
print(komut, "->", sonuc[0] if sonuc else "tanınmıyor")
Çıktıdaki python satırı Store takma adını gösteriyor: gerçek Python kurulu olduğu hâlde ilk sırada takma ad var. ntpath modülü Windows yol kurallarını her işletim sisteminde uygular; Linux'ta çalışırken bile ters bölüyle yol birleştirebilirsin.
PowerShell mı CMD mi? Yürütme ilkesi ve venv
| İş | PowerShell | CMD |
|---|---|---|
| PATH'i görmek | $env:Path -split ';' | echo %PATH% |
| Geçici değişken | $env:PYTHONUTF8 = "1" | set PYTHONUTF8=1 |
| venv etkinleştirme | .venv\Scripts\Activate.ps1 | .venv\Scripts\activate.bat |
| Komutun yeri | Get-Command python | where python |
| Ekranı temizle | cls / Clear-Host | cls |
Windows Terminal ve VS Code varsayılan olarak PowerShell açar. Sanal ortamı (ayrıntısı Sanal ortam ve paket yönetimi dersinde) oluşturup etkinleştirdiğinde ilk karşılaşacağın engel şudur:
.venv\Scripts\Activate.ps1 cannot be loaded because running scripts is disabled on this system.
Bu, PowerShell'in yürütme ilkesi (execution policy) güvenlik ayarıdır; varsayılan "Restricted" hiçbir betiğin çalışmasına izin vermez. Yalnızca kendi kullanıcın için, yönetici gerektirmeden şu ayar yeterlidir:
Get-ExecutionPolicy -List Set-ExecutionPolicy -Scope CurrentUser RemoteSigned py -3.12 -m venv .venv .venv\Scripts\Activate.ps1 python -m pip install --upgrade pip
RemoteSigned: kendi yazdığın yerel betikler çalışır, internetten indirilen betikler imza ister. Unrestricted ya da Bypass kullanma; gereğinden geniştir. Etkinleştirme başarılıysa istemin (prompt) başında (.venv) görürsün; deactivate ile çıkarsın.
import ntpath, posixpath, sys
def venv_python(proje, windows=True):
if windows:
return ntpath.join(proje, ".venv", "Scripts", "python.exe")
return posixpath.join(proje, ".venv", "bin", "python")
print(venv_python(r"C:\dev\anadolu-rapor"))
print(venv_python("/home/ayse/anadolu-rapor", windows=False))
print("Şu an sanal ortamda mıyım?", sys.prefix != sys.base_prefix)
Scripts klasörüne, macOS ve Linux'ta bin klasörüne konur. VS Code bu farkı kendisi bilir; ama bir yapılandırma dosyasına elle yol yazarken ya da CI betiğinde bu fark sık hata kaynağıdır.winget, birden çok sürüm ve kaldırma
winget search Python.Python winget install Python.Python.3.12 winget install Python.Python.3.13 winget upgrade Python.Python.3.12 winget uninstall Python.Python.3.11
Birden çok sürüm yan yana sorunsuz yaşar; her biri kendi klasöründedir. Kural basit: projeyi sürüme bağla, PATH'e değil. Her proje kendi venv'ini py -3.12 -m venv .venv ile oluşturur; o venv etkinken python hep doğru sürümdür. PATH'teki "varsayılan" Python yalnızca hızlı denemeler içindir.
Kaldırma: Ayarlar → Uygulamalar → "Python 3.11.x" → Kaldır (ya da winget uninstall). Kaldırma sonrası üç artık kalabilir: PATH'teki ölü girdiler (elle sil), %LOCALAPPDATA%\Programs\Python altındaki boş klasör ve %LOCALAPPDATA%\pip\Cache önbelleği. Ölü PATH girdisi zararsız görünür ama where çıktısını kafa karıştırıcı yapar.
Belirti → neden → çözüm
| Belirti | Neden | Çözüm |
|---|---|---|
'python' is not recognized / "terimi cmdlet olarak tanınmıyor" | Python klasörü PATH'te yok | Yükleyiciyi tekrar çalıştır → Modify → "Add to environment variables"; ya da py kullan |
python yazınca Store açılıyor / "Python was not found" | WindowsApps takma adı PATH'te önde | App execution aliases'ta python.exe ve python3.exe'yi kapat |
'pip' is not recognized | Scripts klasörü PATH'te yok | Her zaman python -m pip ya da py -m pip kullan |
Activate.ps1 cannot be loaded | PowerShell yürütme ilkesi Restricted | Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |
SSL: CERTIFICATE_VERIFY_FAILED (pip install) | Kurumsal ağ trafiği kendi sertifikasıyla inceliyor | BT'den kurum sertifikasını iste: pip config set global.cert C:\certs\kurum.pem; --trusted-host yalnız geçici çözüm |
PermissionError / "Access is denied" | Program Files'a yöneticisiz paket kurmaya çalışmak ya da dosya başka programda açık | venv kullan; VS Code ve açık terminalleri kapatıp tekrar dene |
| Kullanıcı adı "Şükrü" ya da "Ayşe Yılmaz": bazı araçlar yol hatası veriyor | Türkçe karakter ve boşluk eski araçlarda kodlama/tırnak sorunu yaratır | Python'ı C:\Python312'ye, projeleri C:\dev'e koy; yolları tırnakla yaz |
| Yanlış sürüm çalışıyor (3.9 bekliyorsun 3.12 geliyor) | PATH sırası; where python'da ilk satır başka kurulum | PATH'te sırayı değiştir ya da py -3.12 / venv kullan |
UnicodeEncodeError: Türkçe karakter yazdırırken | Eski konsol kod sayfası (cp857/cp1254) | Windows Terminal kullan; PYTHONUTF8=1 ortam değişkenini ayarla |
| Kurdum ama komut hâlâ yok | Terminal PATH değişmeden önce açılmıştı | Yeni terminal aç; VS Code'u tamamen kapatıp aç |
| pip: "No such file or directory" çok uzun yolda | 260 karakter yol sınırı | Yükleyicideki "Disable path length limit" ya da projeyi kısa yola taşı |
py -3.14 -m venv .venv". Yeni gelen kişi bu listeyi izler, sorun çıkarsa where python, py --list ve python -m pip config list çıktılarını destek kanalına yapıştırır. Bu üç çıktı, sorunların büyük kısmını uzaktan teşhis etmeye yeter.Sessiz kurulum ve otomasyon
BT ekipleri yükleyiciyi ekran açmadan çalıştırır. Komut satırı seçenekleri ekrandaki kutuların karşılığıdır:
python-3.12.4-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 Include_launcher=1 Include_test=0
Böyle bir komutu Python'da shlex ile parçalara ayırabilirsin. shlex.split, kabuk kurallarını uygular: çift tırnak içindeki boşluklar korunur ve tırnaklar atılır. Tırnak dışındaki ters bölü ise kaçış karakteri sayılıp silinir; Windows yollarını komutlarda tırnakla yazmanın bir nedeni de budur.
import shlex
komut = 'python-3.12.4-amd64.exe /quiet InstallAllUsers=0 PrependPath=1 TargetDir="C:\\Program Files\\Python312"'
parcalar = shlex.split(komut)
print(parcalar[0])
for p in parcalar[1:]:
if "=" in p:
anahtar, deger = p.split("=", 1)
print(f" ayar {anahtar:16} = {deger}")
else:
print(f" bayrak {p}")
print(shlex.split(r"TargetDir=C:\Python312")) # tırnaksız: ters bölü kaybolur!
Sanal ortamda olup olmadığını anlamak
sys.prefix çalışan ortamın kökünü, sys.base_prefix o ortamın türetildiği Python kurulumunu gösterir. İkisi farklıysa bir venv içindesin. Her venv'in kökünde pyvenv.cfg dosyası vardır; içindeki home = C:\Python312 satırı ortamın hangi Python'dan oluşturulduğunu söyler. Bu yüzden Python'ı kaldırıp yeniden kurduğunda eski venv'ler bozulur: home artık var olmayan bir yeri gösterir. Çözüm venv'i silip yeniden oluşturmaktır; venv taşınabilir bir şey değildir.
PYTHONUTF8 ve kodlama
Python 3.15 ile UTF-8 modu varsayılan oldu (Ekim 2026). 3.14 ve öncesinde Windows'ta open() varsayılan olarak sistemin kod sayfasını kullanır. Türkçe veriyle çalışıyorsan her zaman open(yol, encoding="utf-8") yaz ya da PYTHONUTF8=1 değişkenini kalıcı olarak ayarla.