11 Kasım 2008 Salı

setup.py Dosyası hazırlamak

Bu yazımızda python un distutils (distutils.core.setup) modülü ile kurulum betiği hazırlayacağız...

distutils modülü öntanımlı olarak python ile gelmektedir.

Öncelikle setup.py den biraz bahsedeilm: çoğu python uygulaması distutils ile kurulum betikleri hazırlar, bunun nedeni distutils in sorunsuz, kolay ve tabi ki python ile birlikte geliyor olması diyebiliriz. :D

Şimdi betiğimizi yazalım:


# -*- coding: utf-8 -*-
# setup.py denemesi...

from distutils.core import setup # distutils.core modülündeki setup metodununu çağırıyoruz...

# simge gibi şeyleri tanımlıyoruz...
datas = [("share/applications", ["data/kxmp.desktop"]), ("share/pixmaps", ["kxmp/kxmp.png"])]

setup(name = "kxmp",
version = "0.1.2",
description = "Graphical xm player...",
author = "Oğuzhan Eroğlu",
author_email = "oguzhan@oguzhaneroglu.com",
url = "http://kxmp.googlecode.com",
packages = ["kxmp"],
data_files = datas,
scripts = ["data/kxmp"])


Şimdi de kodu açıklayalım:
setup argumanları:

  • name: Uygulamanın adı.
  • version: Uygulamanın sürüm numarası (str olmalı)
  • description: Uygulamanın ne yaptığını anlatan kısa bir açıklama.
  • author: Yazarın adı.
  • author_email: Yazarın e-posta adresi.
  • url: Uygulamanın proje sayfası.
  • packages: Uygulamanın kaynak kodlarının bulunduğu yani kurulacak dizinler (liste olmalı)
  • data_files: Uygulamanın çalıştırma dosyası, .desktop gibi dosyaların bulunduğu dizin. (liste olmalı)
  • scripts: /usr/bin altına gidecek betikler. (liste olmalı)

burdan önemli noktalara değinecek olursak:
packages
, data_files, scripts argumanları liste olmalıdır, çünkü bu tür dizinler birden fazla da olabilir.

datas değişkenini açıklayacak olursak:
yapılan işlem şu liste içerisine bilgiler ("hedefdizin", [kaynakdizinler]) şeklinde veriliyor.

ve dikkat ettiyseniz setup hep /usr/ altında çalışır yani /usr/share/applications yazmak yerine share/applications yazarız.

Yaptığı şeye değinecek olursak çok basit kodlarınızı site-packages dizinine atıyor... yani uygulamayı çalıştıracak betik sadece import a dese yeterli (a burada packages argumanına verilen dizinlerden biri).

İyi çalışmalar...

13 yorum:

  1. Bunun da notlarımızın arasında yer alması iyi oldu. İkide bir unutuyorum, neyin ne işe yaradığını =)

    Eline sağlık.

    YanıtlaSil
  2. Merhaba,
    Bir şey sormak istiyorum bu konularaç ok yabancıyım. Ben bir reklam ajansı işletiyorum küçük çaplı bir firmayız. Satış ağımız iyi fakat bir web tasarımcı işe aldık bir sürü şeyden bahsetti tabii anlamadığım için ses çıkarmıyorum. bana web sayfalarının hızlı açılması için son teknoloji dili olan pyhton u kullanacağını onunla herşeyi yapabileceğini ve ilerleyen yıllarda herkesin bu programı kullanacağını söyledi. şimdi ben googleda arıyorum ama bu program nedir bulamadım.
    Benim elemanım doğrumu diyor yoksa bu program nedir ne işe yarar nerelerde kullanılır bir açıklarsnaız sevinirim.

    YanıtlaSil
  3. Python kullanmayı tercih eden bir programcınız olduğunuz için çok şanslısınız diyebilirim size :) Python özellikle türkiyede yeni yeni tanınmaya başlayan fakat dünyada başka google olmak bir çok şirket tarafından tercih edilen bir programlama dilidir. Türkiyeden örnek isterseniz Tubitak tarafından geliştirilen Pardus projesinin tamamına yakını Python dili kullanılarak geliştirildi. Bunun dışında http://www.ozgurlukicin.com ve http://www.raptiye.org siteleride Python ile geliştirilmiş web sitelerine örnek olarak verilebilir.

    YanıtlaSil
  4. yani bu elemanımın yaptığı siteler piyasadkai diğer siteler gibi siteler olacak değilmi. biliyor yani bu işi.
    Peki bu pyhton sitelerin hızlı açılması için gerekli bir programmı. çünkü normalde benim grafikerim sitenin resmini yapıyor parçaladığını söylüyor sonra yazılımcıya veriyor yazılımcıda onu asp.net dedikleri programla siteye dönüştürüyor. ama bu sisitem yavaş çalışmaya sebepmiş ve çok amatörmüş. esas olan phyton ile yapılmasıymış. doğrumu bu sizce.

    YanıtlaSil
  5. Kullanılan dil sitenizin hızını etkileyecek olan etkenlerden sadece birisidir.Kullandığınız sunucu, trafiğiniz, kodlamanız vb. gibi bir çok etkenide hesaba katmak gerekir. Söylediğim gibi google'ın servislerinde de python kullanılmakta ve gayette hızlı çalışmaktalar :)

    YanıtlaSil
  6. site tasarımını iki başlıkta düşünebilirsiniz:
    -tasarım(görsellik)
    -programlama
    burada python işin programlama kısmını oluşturuyor. görsellik kısmında değişecek birşey yok. yani görsel bir eksiklik olmayacak. ama arka planda yeni bir teknolojiye geçilmiş, daha güvenli, özgün bir sistemlere sahip olacaksanız. Python sade ve hızlı bir dildir uzun uzun kodlarla yapılacak işleri kısa kodlarla rahatça yapar, verimlidir. umarım memnun kalırsınız

    YanıtlaSil
  7. setup.py install ederek yüklediğimiz bir paketi setup.py uninstall diyerek silemiyoruz. Acaba yanlış bir yöntem mi "uninstall" yoksa distutils'in herhangi bir sil komutu yok mu ?
    Son olarak setup.py'ı pisi paketine nasıl entegre ederiz ?

    Cevaplarınız için şimdiden teşekkürler!

    YanıtlaSil
  8. @tdgunes:

    evet uninstall fonksiyonumuz yok diye biliyorum. Ama olmasına da gerek yok, çünkü setup.py'yi kullanarak dağıtıma paketi yaptıktan sonra, dağıtımın paket yöneticisini kullanarak o uygulamayı kaldırmak daha mantıklı bir yol.

    pisi actionsapi için pythonmodules modülü var. Setup.py betiği ile kurulan paketlerin inşa dosyalarını inceleyin: Deluge, sonata, quodlibet, wicd..

    paketler.pardus.org.tr

    YanıtlaSil
  9. İnşa dosyaları için çok teşekkür ederim. Bu arada bir betik için 'setup.py' yazdım. İlginçime giden bir konu dikkatimi çekti. Betiğin iki dosyası vardı. main.py ve engine.py diye. main.py'da import engine satırının çalışmayacağından korktum zira yanında böyle bir dosya yoktu. /usr/bin'e gidecekti. Fakat setup.py ile böyle bir sorun ortaya çıkmadı. Acaba bunun sebebi ne? sys.path ile bir değişiklik mi yapıyor tam anlayamadım ?

    Son olarak bu yaptığım setup.py paketini Ubuntu ve Pardus'ta denedim. İkisinde de "sudo python setup.py install" komutuyla yükledim. Fakat çalıştırabilir dosyası Ubuntu /usr/local/bin'e atarken Pardus'da ise /usr/bin'e atıyor. Yönetici kontrollerinin farklı olmasından mı kaynaklanıyor anlayamadım.

    Cevaplarınız için şimdiden bir daha teşekkürler! :)

    YanıtlaSil
  10. Bir soru daha sormadan edemedim. Bir .pisi paketi yaparsak bunun Pardus Depo'sunda bulundurulması için kim ile konuşulmalıdır ?

    YanıtlaSil
  11. @tdgunes:
    Python betiğinde bir modül çağrıldığı zaman, Python önce kendi kütüphane dizinine bakar. packages değişkenine aldığınız Python betikleri de zaten bu kütüphane dizinine gider öntanımlı olarak.. Paket yöneticisinde de öntanımlı prefix /usr/'dir, Ubuntu'da /usr/locale..

    Şu dosyayı inceleyin, prefix diye aratın:
    http://svn.pardus.org.tr/uludag/trunk/pisi/pisi/actionsapi/variables.py

    YanıtlaSil
  12. uninstall eklemek isteyenler pisiden bir örnek

    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    # Python Libs
    import os
    import shutil

    # DistUtils
    from distutils.core import setup
    from distutils.cmd import Command
    from distutils.command.build import build
    from distutils.command.clean import clean
    from distutils.command.sdist import sdist
    from distutils.command.install import install
    from distutils.sysconfig import get_python_lib

    PROJECT = 'appinfo'

    def plp():
    return os.path.join(get_python_lib(), PROJECT)

    class Clean(clean):
    def run(self):
    print 'Cleaning ...'
    os.system('find -name *.pyc|xargs rm -rf')
    for dirs in ('build', 'dist'):
    if os.path.exists(dirs):
    print ' removing: ', dirs
    shutil.rmtree(dirs)
    clean.run(self)

    class Dist(sdist):
    def run(self):
    os.system('python setup.py build')
    sdist.run(self)

    class Uninstall(Command):
    user_options = []
    def initialize_options(self):
    pass
    def finalize_options(self):
    pass
    def run(self):
    print 'Uninstalling ...'
    project_dir = plp()
    if os.path.exists(project_dir):
    print ' removing: ', project_dir
    shutil.rmtree(project_dir)

    class Install(install):
    def run(self):
    install.run(self)
    root_dir = '/usr/bin'
    if self.root:
    root_dir = "%s/usr/bin" % self.root
    shutil.move('%s/%s.py' % (root_dir, PROJECT), '%s/%s' % (root_dir, PROJECT))


    setup(name=PROJECT,
    version='0.2',
    description='Appinfo: Metadata information for packages',
    long_description='Package Management System indepented, package metadata'\
    'information management system.',
    license='GNU GPL2',
    author='Gökmen Göksel',
    author_email='gokmen@pardus.org.tr',
    url='http://developer.pardus.org.tr',
    packages=[PROJECT, '%s.backends' % PROJECT],
    data_files = [(plp(), ['AUTHORS', 'ChangeLog', 'README', 'COPYING', 'HELP'])],
    scripts = ['appinfo.py'],
    cmdclass = {
    'install': Install,
    'uninstall':Uninstall,
    'clean' :Clean,
    }
    )

    YanıtlaSil