Python maceralarım 3 – Virtual Environment Detaylı Bakış

Önceki yazımızda sanal ortam oluşturma, paket yükleme ve projeyi çalıştırma işlemlerini görmüştük. Şimdi virtual environment konusuna biraz daha detaylı bakalım. Diğer dökümanlara baktığınızda “source”, “activate” ve Python yorumlayıcısını “.env/bin/python” şeklinde değil de doğrudan “python” yazarak çalıştırıldığı görülür. Bunun sebebi kısaca geliştirme yaparken kolaylık olması amacıyladır. Bu ifadelerin nasıl kullanıldığını da anlattıktan sonra diğer makalelerimize geçebiliriz.

Öncelikle *nix sistemlerinde default olarak gelen bir komuttan bahsetmek istiyorum: source. Bu komut bash kabuğunun bir özelliğidir. Şuanki klasörü temel alıp belirtilen dosyanın okunup çalıştırılmasını sağlar. Tabiki belirtilen dosya aslında bir bash kabuğu için yazılmış betiktir. “.env/bin/activate” dosyasını metin editörüyle açtığınızda orada bir bash script görürsünüz. Bu script kabaca “.env” klasörü altındaki bin, include, lib, share, lib64 klasörlerini doğrudan kullanabilmek için gerekli kabuk ayarlarını yapar. Örneğin

$ source .env/bin/activate
(.env) $

Yukarıdaki satırı yazdığınızda hemen altındaki satırda (.env) şeklinde bir ibare görürsünüz. “.env/bin/activate” dosyası sanal ortamın aktif edildiğini yazılımcıya göstermek amacıyla bu şekilde komut satırının görülmesini sağlamıştır. Yani artık “.env” klasörü aktiftir ve PATH ortam değişkenine “.env/bin” klasörü atanmıştır. Burada echo $PATH yazarsanız ilk başta bu klasörün relatif konumunu görürsünüz.

(.env) $ echo $PATH
/media/emir/emir240/Projects/Python/Venv/ExampleVenv/.env/bin:/home/emir/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/media/emir/emir240/Android/Sdk/tools/:/media/emir/emir240/Android/Sdk/tools/bin:/media/emir/emir240/Android/Sdk/platform-tools:/snap/bin:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin

Velhasıl artık “python” yazdığınızda “.env/bin/python” dosyasını çalıştırmış olursunuz. Aynı şekilde “pip install [paket-adı]” yazdığınızda da sanal ortamdaki “pip” komutunu çalıştırıp paketlerin sanal ortam klasörü altına yüklenmesini sağlarsınız. Kısaca sanal ortamın “source” ve “activate” ile aktifleştirilmesinin çok önemli bir esprisi yok. Sadece geliştirme yaparken kolaylık olması açısından böyle bir özellik vardır pythonda. Gerekli birşey mi? Bence değil ama bazıları için gerekli olmuş demekki.

Sanal ortamı aktifleştirdik, gerekli kabuk ayarları “activate” dosyası tarafından yapıldı. Peki bu sanal ortamdan çıkıp konsolu eski haline nasıl getiririz? Tabiki bunun için “deactivate” komutunu kullanıyoruz.

(.env) emir@bugra:~/Projects/Python/Venv/ExampleVenv$ deactivate
emir@bugra:~/Projects/Python/Venv/ExampleVenv$

Gördüğünüz üzere benim kendi komut satırımda virtual env aktifleştirdiğimde yukarıdaki gibi bir satır çıkıyordu. “deactivate” komutunu çalıştırdığımda konsolum eski haline geldi. Bu fonksiyon nereden geliyor diye merak edenler için diyeyim “.env/bin/activate” dosyası içerisinde tanımlanmıştır. Bu dosyayı metin editörüyle açtığınızda ilk karşımıza bu fonksiyon çıkmaktadır.

Bağımlılıkların Tek Dosyadan Yönetilmesi

Son olarak bahsetmem gereken bir konu daha var o da paketlerin toplu şekilde yüklenmesi. Diğer dillerdeki paket yöneticileri proje detayları ve bağımlılıklarla yani gerekli kütüphanelerle ilgili bilgilerin bulunduğu belirli isimde bir dosyaya ihtiyaç vardır. Örneğin PHP’de composer kullanabilmek için composer.json dosyası, NodeJS’te NPM için package.json dosyası, Java’da Maven kullanabilmek için pom.xml dosyası gerekmektedir. Bu dosyalarda yüklenecek kütüphaneler, bu kütüphanelerin versiyonları hatta nereden yükleneceği (Git, Svn, standart paket reposu), bazı kütüphaneleri saf dışı bırakma gibi özellikler vardır. Bu özellikler Python Virtual Env’de de var. Nasıl yapacağız? Öncelikle gerekli kütüphanelerin isimlerini tek dosya içerisinde nasıl barındırıyoruz onu görelim. Dosyanın ismi farketmez ama Python camiasında herkesin kullandığı isim “requirements.txt” dosyasıdır. Biz de bu şekilde kullanabiliriz.

$ nano requirements.txt

Bu komutla dosyayı açıp içerisine doğrudan kütüphane isimlerini yazıyoruz

numpy
pandas
urllib3
matplotlib
PyQt5

Dosyayı kaydedip çıkıyoruz. Şimdi aşağıdaki komutu kullanarak bu dosyadaki tüm kütüphanelerin tek seferde yüklenmesini sağlayabiliriz.

$ .env/bin/pip install -r requirements.txt

Bu dosyayı kendimiz yazarak yükleyebildiğimiz gibi manuel yüklediğimiz kütüphanelerin requirements.txt dosyası içerisine “pip” kullanarak yazılmasını da sağlayabiliriz. Bunun için “pip freeze” komutunu kullanmalıyız.

$ .env/bin/pip freeze > requirements.txt

Normalde “pip freeze” yazdığımızda yüklü kütüphanelerin isim ve versiyonlarını ekrana yazar. Biz “>” yazarak çıktıyı dosyaya yönlendiriyoruz ve tüm kütüphane isimleri ve versiyonları “requirements.txt” dosyası içerisine yazılmış olur. Bu dosyayı git veya svn’e yükleyebiliriz bunda bir sakınca yoktur. “.evn” klasörünü git veya svn’e yüklememek için ve gerekli kütüphanelerin tek bir dosya içerisinde bulunmasını sağlayarak projenin paylaşılması ve diğer geliştiricilerin işini kolaylaştırmak için bu yöntemi kullanmalıyız.

Virtual environment konusunu da bu şekilde halletmiş olduk. İlerleyen zamanlarda yeni python maceralarımda görüşmek dileğiyle esen kalın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload the CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.