Python Kurulum Betiği Hazırlamak

Posted on Cts 11 Nisan 2015 in Python, Modüller

Python ile ilginenler, en azından bir kaç kez üçüncü şahısların yazdığı modüllerden yüklemiştir ve bu modülü yüklerken modülle birlikte gelen setup.py betiğini build ve/veya install parametresiyle çalıştırmıştır. Bu kurulum betiği sayesinde geliştiriciler zaman kaybetmeden modülü kullanılabilir hale getirir… Biz de bu yazıda işimizi yeteri kadar görecek şekilde kurulum betiği dosyası hazırlamayı öğreneceğiz. Bu yazıdan kısa süre önce ilk defa kurulum betiği hazırlamış oldum…

Zorunlu olmasa da genel olarak kurulum betiğine setup.py adını veriyoruz ve bu yazı da kurulum betiğimizi bu dosyada hazırlayacağız.

Bir kurulum betiği hazırlamak için Python ile gelen distutils modülünü kullanıyoruz.

from distutils.core import setup

setup()

distutils.core modülünde bulunan setup fonksiyonunu kullanarak modülümüzle ilgili gerekli bilgileri girmemiz gerekiyor.

Örneğin hede.py adında tek dosyadan oluşan bir modülümüz var. Bunun kurulum betiğini oluşturalım…

from distutils.core import setup

setup(
    name = "hede",
    py_modules = ["hede"],
    version = "1.0",
  • name parametresi uygulamanın adını belirtir.
  • py_modules parametresine liste olarak girilen isimler *.py dosyalarının uzantısız hali olmalıdır. Bu parametre tekil modülleri bekler.
  • version parametresi ise uygulamanızın versiyonunu belirtir.

name ve version parametreleri, uygulamanızı easy_install ve/veya pip ile kurulabilmesi için pypi adresinde yayınlamanızda gereklidir. Şimdi setup.py dosyasının olduğu dizine konsol ile girin ve;

python setup.py sdist

komutunu verin. Bulunduğunuz dizinde dist adında bir dizin ve içinde hede-1.0.tar.gz adlı bir dosya oluşacaktır. Daha sonra bu dosyayı pypi adresinde nasıl yayınlayacağımızı göreceğiz…

hede.py modülünü kurmak için de;

python setup.py install

komutunu verebilirsiniz. Windows kullanıcıları için binary dosya oluşturmak için;

python setup.py bdist_wininst

Fedora, Mageia gibi rpm paket sistemini kullanan kişiler için;

python setup.py bdist_rpm

komutunu verebilirsiniz. Windows kullanıcıları için Linux altında da binary(*.exe) oluşturmak mümkün. Ancak bunun için Python’un geliştiriciler için olan paketini kurmanız gerekmektedir. Ubuntu da python-dev ismiyle bulup kurmak mümkün. Diğer GNU/Linux dağıtımlarında da ismi büyük ihtimal aynıdır…

Aynı şekilde rpm paketi oluşturmak içinde python-dev paketinin kurulu olması gerekebilir…

Uygulamamızı biraz daha geliştirelim. lib adında bir modül paketi oluşturup(İçinde init.py olan bir dizin) içine hedelib.py ve hodolib.py modüllerini ve lib2 adında bir modül paketi oluşturup içine hedelib2.py adlı bir modül oluşturduğumuzu varsayalım.

hede.py
lib/
    lib2/
        __init__.py
        hedelib2.py
    __init__.py
    hedelib.py
    hodolib.py

Uygulamamızda modül paketi varsa setup() fonksiyonuna packages parametresini ekleyip paketlerin ismini içeren bir liste girmeliyiz.

from distutils.core import setup

setup(name='hede',
      version='1.0',
      description='Python hede kütüphanesi',
      author='Metehan Özbek',
      author_email='metehan [at] metehan.us',
      url='http://www.metehan.us',
      packages=['lib', 'lib.lib2'],
     )

Python paket indeksinde gözükmesi içinde url, author, author_email ve description parametrelerini girdik.

python setup.py install

Komutunu verdiğinizde Python’un kütüphanelerinin bulunduğu dizin içerisindeki site-packages(Ubuntu da dist-packages) dizininde; hede.py ve lib modül paketi içinde, lib2 dizini ve modüllerle beraber yüklenecektir. Bu durumda Python yorumlayıcısında modülünüzü şu şekilde çağırabilirsiniz:

import hede
from lib.lib2 import hedelib2
from lib import hedelib, hodolib

Tabii lib ismi çok kullanıldığından bir ihtimal çakışma olabilir. Bunu önlemek için ana modül paketinizi hede yapmanız daha doğru olacaktır.

from hede import hede
from hede.lib.lib2 import hedelib2

Uygulamanızda çalıştırılabilir bir betik oluşturmak isteyebilirsiniz. Oluşturduğunuz betiği(ör: hede) konsoldan hede yazarak çalıştırmak isteyebilirsiniz. setup() fonksiyonuna gireceğiniz scripts parametresiyle liste olarak girdiğiniz betikleri GNU/Linux ortamında /usr/bin/ altına Windowsta ise Python’un kurulduğu dizin içerisindeki Scripts dizinine yazdırabilirsiniz. Yalnız Windowsta betiğinizi çalıştırabilmek için bir *.bat dosyası ile betiğinizi çalıştırmanız gerekmektedir(ör: hede için hede.bat) ve path e ekli olmadığından cmd ile betiğinizi çalıştıramazsınız.

hede.py
script/
    hede
lib/
    lib2/
        __init__.py
        hedelib2.py
    __init__.py
    hedelib.py
    hodolib.py

from distutils.core import setup

setup(name='hede',
      version='1.0',
      description='Python hede kütüphanesi',
      author='Metehan Özbek',
      author_email='metehan [at] metehan.us',
      url='http://www.metehan.us',
      packages=['lib', 'lib.lib2'],
      scripts=["script/hede"]
     )

Uygulamız gelişti ve resim, ses dosyası gibi veriler ekledik. Dizin içindeki verileri almak için data_files, modül paketi içindeki veri dizinlerini almak için package_data parametrelerini kullanırız. Yeni dizin-dosya yapımız şöyle olsun:

hede.py
data/
    veri.db
script/
    hede
lib/
    lib2/
        data/
            simge.png
        __init__.py
        hedelib2.py
    __init__.py
    hedelib.py
    hodolib.py

Bu dosya-dizin yapısına göre veri dosyalarımızı kurulum betiğimize ekleyelim.

from distutils.core import setup

setup(name='hede',
      version='1.0',
      description='Python hede kütüphanesi',
      author='Metehan Özbek',
      author_email='metehan [at] metehan.us',
      url='http://www.metehan.us',
      packages=['lib', 'lib.lib2'],
      scripts=["script/hede"],
      data_files=[("data", ["veri.db"])],
      package_data={"lib.lib2":["data/*"]}
     )

Görüldüğü üzere data_files bir liste verisi alıyor. Listenin her elemanı birer tuple. Tuple ilk elemanı dizin, ikinci elemanı ise dosya ismidir. package_data ise bir sözlük veri tipi alıyor ve her elemanın anahtar ögesi modül paketi ismi, değer ögesi ise liste olarak dizin ve dosya alıyor. Burada düzenli ifadelerin kullanımıda mümkün(regex).

setup.py betiğini çalıştırırken kullandığımız sdist argümanıyla uygulamanızın sıkıştırılmış halini alıyorsunuz. Bu dosya içerisinde bulunmasını istediğiniz ek dosyaları MANIFEST.in adlı dosya da tanımlayabilirsiniz. Buradan kullanılabilir kodları öğrenebilirsiniz.

setup() fonksiyonunun alabileceği tüm parametrelere buradan ulaşabilirsiniz. Temel olarak bir kurulum betiğini hazırlamayı öğrendiğimize göre artık modülümüzü-uygulamamızı Python Package Index sayfasına yollayalım…

setup.py betiğimizin bulunduğu dizine konsol ve/veya cmd ile geliyoruz ve

python setup.py register

diyoruz. Bizden dört adet seçenekten birini seçmemizi istiyor.

running register
running check
We need to know who you are, so please choose either:
 1. use your existing login,
 2. register as a new user,
 3. have the server generate a new password for you (and email it to you), or
 4. quit
Your selection [default 1]:

Daha önce pypi ye üye olmadıysanız 2 yazıp kayıt işlemini gerçekleştirebilirsiniz. Ben önceden kayıt olduğum için 1 yazıp devam ediyorum…

İkinci aşamada kullanıcı adı ve şifremizi soruyor ve sırayla gerekli bilgileri giriyoruz. Ardından kullanıcı bilgilerimizi kayıt edeyim mi diye soruyor. Yanıtı y diye verirseniz uygulamanızı güncelleyip yollamak istediğinizde kullanıcı adı ve şifre girmekten muaf olursunuz.

Username: mthnzbk
Password:
Registering parcala to http://pypi.python.org/pypi
Server response (200): OK
I can store your PyPI login so future submissions will be faster.
(the login will be stored in /home/metehan/.pypirc)
Save your login (y/N)?y

Buraya kadar sadece uygulamamızı pypi sayfasına kayıt ettirmiş olduk. Şimdi ise uygulamamızı arşivleyip ya da çalıştırılabilir hale getirip uygulama sayfasında yayınlayalım.

python setup.py sdist upload

ya da

python setup.py bdist_wininst upload
python setup.py bdist_rpm upload

Bir aksilik olmazsa uygulamanız, uygulama sayfanızda gözükmek üzere yüklenecektir…

Kaynaklar:

http://docs.python.org/distutils/setupscript.html

http://docs.python.org/install/index.html

http://docs.python.org/distutils/apiref.html

Buraya bakarlar:

http://docs.python.org/distutils/configfile.html

http://docs.python.org/distutils/sourcedist.html

http://docs.python.org/distutils/builtdist.html

http://pypi.python.org/pypi?:action=list_classifiers