May 18, 2020

Python'da Sürüm ve Paket Yönetimi

Python’da proje geliştirirken karşılaştığım bir takım problemleri ve bulunduğum Telegram gruplarında benzer sorunları yaşayan arkadaşları gördükten sonra bu yazıyı hazırlamaya karar verdim ve güzel anlattığını düşündüğüm bazı kaynaklara bakarak derlemeye çalıştım.

Python'da Sürüm Yönetimi

pyenv nedir?

pyenv sisteminizde birden fazla Python sürümünü kullanabilmenizi sağlayan ve birçok kolaylığı da beraberinde sunan bir araçtır.

pyenv’e neden ihtiyacımız vardır?

GNU/Linux veya Mac kullanıyorsanız işletim sisteminizde Python kurulu olarak gelmiştir ve muhtemelen güncel olmayan bir sürüm yüklüdür. Bu durumda Python sürümünüzü güncellemek isteyeceksinizdir. Aksine güncel bir sürüm kullanıyor olup aşağıdaki durumları da değerlendirmek isteyebilirsiniz:

  • Geliştirdiğiniz projenin farklı sürümlerde testlerini gerçekleştirmek istemeniz,
  • Kullanmak istediğiniz modülün sisteminizdeki Python sürümü ile uyuşmaması,
  • Denemek istediğiniz projenin farklı bir Python sürümü gerektirmesi,
  • İhtiyaç olmasa bile yeni gelen güncellemeleri denemek istemeniz vb. şekilde çoğaltılabilir.

Bu gibi durumlarda sisteminizde ön yüklü olan Python’a etki etmeden pyenv ile çok daha pratik bir şekilde bu kurulumları sağlayabilir ve farklı sürümler arasında kolayca geçiş yapabilirsiniz. Bunun yanı sıra ön yüklü olan Python sürümünde bazı modül kurulumlarında başarısız olabilirsiniz. Çünkü kurulması istenen paket sisteme etki edecek ise yetkilendirme olmadığı için böyle bir hata verebilir. Tabi ki bu durumu yetkilendirme ile çözebilirsiniz fakat çözmeli misiniz? Kısa cevap: Hayır, Uzun cevap: Yazının ilerleyen kısımlarında virtualenv ile birlikte değineceğim.

pyenv kurulumu aşamalarına geçmeden önce belirtmek isterim ki maalesef pyenv’in Windows desteği bulunmamaktadır fakat geliştirilmekte olan pyenv-win projesini inceleyebilirsiniz.

pyenv Kurulumu

Bağımlılıkların Kurulumu

pyenv kullanımı için öncelikle bağımlılıkların kurulması gerekmektedir. Manuel kurulumlarda en sık karşılaşılan sorun bağımlılıkların eksik olması sebebiyle kurulumların hata vermesidir. Bağımlılıkların kurulumu ise sistemlere göre farklılık göstermekte olup yaygın kullanılan sistemlerde şu komutlar geçerlidir.

Ubuntu/Debian

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

Fedora/CentOs/RHEL

$ sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel

macOS

$ brew install openssl readline sqlite3 xz zlib

pyenv Kurulumu

Bağımlılıkları kurduktan sonra pyenv kurulumuna geçebilirsiniz. Kurulumu pyenv-installer ile aşağıdaki şekilde gerçekleştirebilirsiniz.

$ curl https://pyenv.run | bash 

pyenv-installer ile birlikte bazı eklentiler de otomatik olarak kurulmaktadır. Böylece ayrıca kurmakla uğraşmanıza gerek kalmayacaktır. Birlikte kurulan eklentiler:

  1. pyenv: pyenv uygulaması
  2. pyenv-virtualenv: pyenv ve virtualenv oluşturmak için eklenti
  3. pyevn-update: pyenv için güncelleme eklentisi
  4. pyenv-doctor: pyenv için bağımlılıkların yüklü olup olmadığını kontrol eden eklenti

pyenv kurulumu sonrasında çalıştırabilmek için path'e eklemeniz gerekmektedir. Kullandığınız terminale göre ~/.bash_profile, ~/.bashrc, ~/.zshrc dosyanıza aşağıdaki satırları eklemeniz gerekmektedir.

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Otomatik kurulum yerine isterseniz pyenv reposundan kurulum adımlarını takip ederek kurulumu kendiniz gerçekleştirebilir veya daha detaylı bilgi alabilirsiniz.

pyenv ile Python Sürümlerinin Kurulumu

pyenv kurulumu sonrasında yüklemek için seçebileceğiniz bir sürü Python sürümü bulunmaktadır.

Yüklenebilecek bütün Python sürümlerini görmek için

$ pyenv install --list

Yalnızca 3.7-3.9 arasındaki Python sürümlerini görmek için

$ pyenv install --list | grep " 3\.[789]"

Yalnızca anaconda sürümlerini listelemek için

$ pyenv install --list | grep anaconda

İstediğiniz Python sürümünü yüklemek için ise

$ pyenv install 3.8.3

Kurmuş olduğunuz Python sürümünü mevcut dizininizde aktif hale getirmek için local komutunu kullanabilirsiniz

$ pyenv local 3.8.3

Python sürümünü terminalinizde kalıcı yapmak içinse global komutunu kullanmalısınız

$ pyenv global 3.8.3

pyenv ile yüklemiş olduğunuz Python sürümleri .pyenv/versions/ dizinine yüklenecektir. Kaldırmak istediğiniz sürümleri

$ pyenv uninstall 3.8.3 veya $ rm -rf .pyenv/versions/3.8.3 komutları ile sisteminizden kaldırabilirsiniz.


Python’da Paket Yönetimi

Python’da paket yönetimi için standart olarak pip kullanılmaktadır. Kurulum sırasında pip öncelikle bağımlılıkların sistemde yüklü olup olmadığını kontrol etmekte, paket sistemde yüklü değilse yükleme işlemini gerçekleştirmektedir. Yüklenen paketler işletim sisteminin kök dizinindeki varsayılan paket alanına yüklenmektedir. Paketlerin yüklendiği konumu aşağıdaki satırı çalıştırarak görebilirsiniz.

$ python -c “import sys; print(‘\n’.join(sys.path))”

Varsayılan ayarlarda kurmuş olduğunuz paketler global olarak kurulmakta ve yalnızca tek bir Python sürümü için yüklenmektedir. Bu durum yüklenen paket bağımlılıklarının farklı sürümlerde modül veya uygulama bağımlılığı bulunması durumunda sorun oluşturabilmektedir. Her şey çok düzgün çalışıyor olsa bile bir gün problem oluşturma durumu vardır.

Diğer bir potansiyel sorun ise Unix-like dağıtımlar Python paketlerini dahili paket yöneticileri (yum, apt, pacman, brew vb.) ile yönetmesi ve bu araçların kullanıcı yetkisinin bulunmadığı alanlara kurulum yapmasıdır.

pip ile yüklemeye çalıştığınız bir paket yetkilendirme olmadığı için hata oluşturup kurulumu tamamlamayabilir. Tabi kisudo komutu ile yetki vererek kurulumu hatasız bir şekilde tamamlayabilirsiniz. Linux dağıtımının kendi paket yöneticisini etkilemenizin sonuçları olabilir ve ilerleyen zamanlarda paket yöneticisini kullanarak yükleme, güncelleme veya silme işlemlerinde sorun yaşayabilirsiniz.

Unix-like sistemlerde ise işletim sisteminiz sistem araçları için Python kullanmaktadır ve dışarıdan yetkilendirerek kuruluma zorladığınız paketler potansiyel bir sorun oluşturabilir. Bu durum sisteminizin çalışmamasına sebep verebilir ve tek çözümünüz yedeklediğiniz bir noktaya geri yüklemek veya sisteminizi formatlamak olabilir.

sudo pip install: Kötü fikir

Setup.py gibi bir yükleme script’ini yetkilendirme ile çalıştırma sisteminizi zararlı kodlara veya hatalara karşı savunmasız duruma getirebilir. Bu sandığınızdan daha büyük bir problem olabilir. Örneğin 2017 yılında PyPI’ye yaygın kullanılan Python paketlerine benzer isimlerle çeşitli paketler yüklendi. Bu paketler sistem ve kullanıcı bilgilerini toplayıp başka bir uzak sunucuya yükleme yapıyordu. Kısa bir süre içinde bu sorun çözülmüş olsa da bu tip yazım hataları gibi durumlar her an tekrarlayabilir.

Güvenlik sorunlarını bir kenara bırakırsak sudo pip install bağımlılık problemlerini tamamen çözmeyecektir. Modülünüzün hala tek bir sürüm için çalışır olması uygulamalarınızın kolayca bozulmasına sebep olabilir.

Sanal Ortamlara (Virtual Enviroments) Giriş

Sanal ortamlar kullanıcıya Python paketlerini aynı sistemde birbirinden bağımsız olarak yönetebilmesini sağlar. Virtualenv yeni bir dizin oluşturarak Python sistemini ve paket yönetimi araçlarını (setuptools, pip ve wheel) sistemden bağımsız olarak tutar.

Sanal Ortamların Oluşturulması

virtualenv3. parti bir modül fakat Python 3.3 ile birlikte venv paketi standart olarak eklendi. Dolayısıyla güncel Python sürümlerinde sanal ortam oluşturmak için herhangi bir paket yüklemesi yapmamıza gerek yoktur. Basit bir şekilde aşağıdaki komutu çalıştırarak sanal ortam oluşturabilirsiniz

$ python -m venv test-env

Burada python komutu terminalinizde varsayılan sürümü çağırmaktadır. Kurulu python3 için python yerine python3 yazabilir veya aktif python sürümünü python --version yazarak öğrenebilirsiniz.

-m venv sanal ortam paketini çağıran komut satırı argümanı, sondaki test-envise sanal ortamınıza verdiğiniz isimdir.

Oluşturduğunuz sanal ortam komutu çalıştırdığınız dizinde oluşacaktır. Linux sistemlerde herhangi bir ayar değiştirmediğiniz durumda ortam /home/<kullanici-adi> dizininde oluşur. Oluşturduğunuz ortamı aktifleştirmek için aşağıdaki komut çalıştırılır.

$ source test-env/bin/activate

Ortam aktifleştikten sonra terminaliniz artık şu şekilde gözükecektir.

(test-env) $

İstediğiniz paketleri sanal ortamınızda yetkilendirme gereksinimleri olmadan özgürce kurabilirsiniz. Sanal ortamdan çıkmak için ise şu komutu çalıştırmanız yeterlidir.

(test-env) $ deactivate

Python'da dahili venv yerine ise bahsi geçen pyenv-virtualenv ile kurmuş olduğunuz farklı python sürümleri üzerinden sanal ortamlar oluşturabilirsiniz.


Her iki konunun da birbiri ile ilişkili olduğunu düşünerek tek başlıkta ele aldım. Bu sebeple uzunca bir yazı oldu. Ayrıca pyenv hakkında pek Türkçe kaynağa denk gelmememin yanı sıra venv gerekliliği hakkında değinilmeyen 1-2 konuyu da aktarmak istedim. Yazının tamamına yakını alıntı veya çeviridir. İngilizcemin el verdiği kadarıyla önemli kısımları özetleyerek aktarmaya çalıştım. Umarım faydalı olmuştur.

Kaynaklar ve faydalı olabilecek linkler

Burak tarafından Mühendis Köyü için hazırlanmıştır. Discord ve Telegram kanallarımıza katılın.