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...
Bunun da notlarımızın arasında yer alması iyi oldu. İkide bir unutuyorum, neyin ne işe yaradığını =)
YanıtlaSilEline sağlık.
+1
YanıtlaSilMerhaba,
YanıtlaSilBir ş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.
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ıtlaSilyani bu elemanımın yaptığı siteler piyasadkai diğer siteler gibi siteler olacak değilmi. biliyor yani bu işi.
YanıtlaSilPeki 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.
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ıtlaSilsite tasarımını iki başlıkta düşünebilirsiniz:
YanıtlaSil-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
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 ?
YanıtlaSilSon olarak setup.py'ı pisi paketine nasıl entegre ederiz ?
Cevaplarınız için şimdiden teşekkürler!
@tdgunes:
YanıtlaSilevet 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
İ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 ?
YanıtlaSilSon 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! :)
Bir soru daha sormadan edemedim. Bir .pisi paketi yaparsak bunun Pardus Depo'sunda bulundurulması için kim ile konuşulmalıdır ?
YanıtlaSil@tdgunes:
YanıtlaSilPython 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
uninstall eklemek isteyenler pisiden bir örnek
YanıtlaSil#!/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,
}
)