# 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']
    >>>

## 12.3. Paketleri pip ile Yönetme

You can install, upgrade, and remove packages using a program called pip. By default `pip` will install packages from the Python Package Index. You can browse the Python Package Index by going to it in your web browser.

`pip` bir dizi alt komut içerir: “install” (yükle), “uninstall” (kaldır), “freeze” (dondur), vb. (`pip` için eksiksiz dokümantasyon için Installing Python Modules 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 yeniden çalıştırırsanız, `pip` istenen sürümün zaten yüklü olduğunu fark eder ve hiçbir şey yapmaz. Bu sürüme erişmek için farklı bir sürüm numarası edinebilir veya paketi en son sürüme yükseltmek için `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

`pip uninstall` ve ardından bir veya daha fazla paket adı paketleri sanal ortamdan kaldırır.

`pip show` belirli bir paketle ilgili bilgileri görüntüler:

    (tutorial-env) $ 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:

`pip list` sanal ortamda yüklü tüm paketleri görüntüler:

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

`pip freeze` yüklü paketlerin benzer bir listesini oluşturur, ancak çıktı `pip install` beklediği biçimi kullanır. Genel bir kullanım, bu listeyi bir `requirements.txt` dosyasına koymaktır:

    (tutorial-env) $ 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` daha birçok seçeneğe sahiptir. `pip` için eksiksiz dokümantasyona Installing Python Modules adresinden ulaşabilirsiniz. Bir paket yazdığınızda ve paketi Python Paket Dizini’nde kullanılabilir hale getirmek istediğinizde Python Modüllerini Dağıtma rehberine bakın.