12. Sanal Ortamlar ve Paketler
******************************


12.1. Tanıtım
=============

Python uygulamaları genellikle standart kütüphanenin bir parçası
olmayan paketleri ve modülleri kullanır.  Uygulama bazen kütüphanenin
spesifik bir sürümüne ihtiyaç duyar, çünkü uygulama belirli bir
hatanın düzeltilmiş olmasını veya uygulamanın kütüphanenin
arabiriminin eski bir sürümü kullanılarak yazılmasını gerektirebilir.

Bu, bir Python yüklemesinin, her uygulamanın gereksinimlerini
karşılamasının mümkün olmayabileceği anlamına gelir.  Bir A uygulaması
belirli bir modülün 1.0 sürümüne, bir B uygulaması ise 2.0 sürümüne
ihtiyaç duyuyorsa, sürümlerin farklı olmasından dolayı versiyon 1.0
veya 2.0'ı yüklemek A veya B uygulamasından birini çalışmaz hale
getirecektir.

Bu sorunun çözümü, spesifik bir Python sürümü için Python yüklemesi ve
bir dizi ek paket içeren bağımsız bir dizin ağacı olan *virtual
environment* (sanal ortam) oluşturmaktır.

Bu sayede farklı uygulamalar farklı sanal ortamlar kullanabilir.
Çakışan gereksinimlerin önceki örneğini çözmek için, A uygulamasının
sanal ortamında sürüm 1.0 yüklüyken, B uygulamasının sanal ortamında
sürüm 2.0 yüklü olabilir. B uygulaması bir kitaplığın sürüm 3.0'a
yükseltilmesini gerektiriyorsa, bu uygulama A'nın ortamını etkilemez.


12.2. Sanal Ortamlar Oluşturma
==============================

Sanal ortamlar oluşturmak ve yönetmek için kullanılan modüle "venv"
denir.  "venv" genellikle mevcut olan en son Python sürümünü yükler.
Sisteminizde birden fazla Python sürümü varsa, "python3" veya
istediğiniz sürümü çalıştırarak belirli bir Python sürümünü
seçebilirsiniz.

Sanal ortam oluşturmak için, yerleştirmek istediğiniz dizine karar
verin ve "venv" modülünü dizin yolu ile bir komut dosyası olarak
çalıştırın:

   python -m venv tutorial-env

Bu, eğer yoksa "tutorial-env" dizinini oluşturur ve ayrıca Python
derleyicisinin bir kopyasını ve çeşitli destekleyici dosyaları içeren
dizinler oluşturur.

Sanal ortam için ortak bir dizin konumu ".venv" 'dir. Bu ad, dizini
genellikle kabuğunuzda gizli tutar ve böylece dizinin neden var
olduğunu açıklayan bir ad verirken aradan uzak tutar. Ayrıca, bazı
araç çalıştırmanın desteklediği ".env" ortam değişkeni tanım
dosyalarıyla çakışmayı önler.

Sanal bir ortam oluşturduktan sonra onu etkinleştirebilirsiniz.

Windows'da çalıştır:

   tutorial-env\Scripts\activate.bat

Unix veya MacOS'ta çalıştır:

   source tutorial-env/bin/activate

(Bu komut dosyası bash kabuğu için yazılmıştır.  Eğer **csh** veya
**fish** kabuklarını kullanıyorsanız, bunun yerine "activate.csh" veya
"activate.fish" komut dosyalarını kullanmanız gerekmektedir.)

Sanal ortamı etkinleştirmek, hangi sanal ortamı kullandığınızı
göstermek için kabuğunuzun görünüşünü değiştirir ve ortamı
değiştirerek "python" komutunun belirlediğiniz spesifik Python
kurulumunu ve sürümünü çalıştırmasını sağlar. Mesela:

   $ source ~/envs/tutorial-env/bin/activate
   (tutorial-env) $ python
   Python 3.5.1 (default, May  6 2016, 10:59:36)
     ...
   >>> import sys
   >>> sys.path
   ['', '/usr/local/lib/python35.zip', ...,
   '~/envs/tutorial-env/lib/python3.5/site-packages']
   >>>

Bir sanal ortamı devre dışı bırakmak için şunu yazın:

   deactivate

terminalin içine.


12.3. Paketleri pip ile Yönetme
===============================

**pip** adlı bir program kullanarak paketleri yükleyebilir,
yükseltebilir ve kaldırabilirsiniz.  Varsayılan olarak "pip", Python
Paket Dizini 'nden paketler yükler.  Python Paket Dizini'ne web
tarayıcınızdan giderek göz atabilirsiniz.

"pip" bir dizi alt komut içerir: "install" (yükle), "uninstall"
(kaldır), "freeze" (dondur), vb.  ("pip" için eksiksiz dokümantasyon
için Python Modüllerini Kurmak rehberine bakın.)

Paketin adını belirterek paketin en son sürümünü yükleyebilirsiniz:

   (tutorial-env) $ python -m pip install novas
   Collecting novas
     Downloading novas-3.1.1.3.tar.gz (136kB)
   Installing collected packages: novas
     Running setup.py install for novas
   Successfully installed novas-3.1.1.3

Paketin belirli bir sürümünü, paket adını ve ardından "==" ve sürüm
numarasını vererek de yükleyebilirsiniz:

   (tutorial-env) $ python -m pip install requests==2.6.0
   Collecting requests==2.6.0
     Using cached requests-2.6.0-py2.py3-none-any.whl
   Installing collected packages: requests
   Successfully installed requests-2.6.0

Bu komutu tekrar çalıştırırsanız, "pip" istenen sürümün kurulu
olduğunu fark edecek ve hiçbir şey yapmayacaktır. Bu sürümü almak için
farklı bir sürüm numarası sağlayabilir veya paketi en son sürüme
yükseltmek için "python -m pip install --upgrade" komutunu
çalıştırabilirsiniz:

   (tutorial-env) $ python -m pip install --upgrade requests
   Collecting requests
   Installing collected packages: requests
     Found existing installation: requests 2.6.0
       Uninstalling requests-2.6.0:
         Successfully uninstalled requests-2.6.0
   Successfully installed requests-2.7.0

"python -m pip uninstall" ve ardından gelen bir veya daha fazla paket
adı, paketleri sanal ortamdan kaldıracaktır.

"python -m pip show" belirli bir paket hakkındaki bilgileri
görüntüleyecektir:

   (tutorial-env) $ python -m pip show requests
   ---
   Metadata-Version: 2.0
   Name: requests
   Version: 2.7.0
   Summary: Python HTTP for Humans.
   Home-page: http://python-requests.org
   Author: Kenneth Reitz
   Author-email: me@kennethreitz.com
   License: Apache 2.0
   Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
   Requires:

"python -m pip list" sanal ortamda yüklü olan tüm paketleri
gösterecektir:

   (tutorial-env) $ python -m pip list
   novas (3.1.1.3)
   numpy (1.9.2)
   pip (7.0.3)
   requests (2.7.0)
   setuptools (16.0)

"python -m pip freeze" yüklü paketlerin benzer bir listesini
üretecektir, ancak çıktı "python -m pip install"'ın beklediği biçimi
kullanır. Genel bir kullanım bu listeyi bir "requirements.txt"
dosyasına koymaktır:

   (tutorial-env) $ python -m pip freeze > requirements.txt
   (tutorial-env) $ cat requirements.txt
   novas==3.1.1.3
   numpy==1.9.2
   requests==2.7.0

"requirements.txt" daha sonra sürüm denetimine kaydedilebilir ve bir
uygulamanın parçası olarak gönderilebilir.  Kullanıcılar daha sonra
gerekli tüm paketleri "install -r" ile yükleyebilir:

   (tutorial-env) $ python -m pip install -r requirements.txt
   Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
     ...
   Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
     ...
   Collecting requests==2.7.0 (from -r requirements.txt (line 3))
     ...
   Installing collected packages: novas, numpy, requests
     Running setup.py install for novas
   Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

"pip" has many more options.  Consult the Python Modüllerini Kurmak
guide for complete documentation for "pip".  When you've written a
package and want to make it available on the Python Package Index,
consult the Python packaging user guide.
