Sayfalar

python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

7 Ocak 2011 Cuma

Python ConfigParser (Configuration file parser) Modülü

Bu modül ConfigParser sınıfını tanımlar. ConfigParser sınıfı Microsoft Windows INI dosyalarında bulabileceğinize benzer yapıda basit ayar dosyası ayrıştırma(parser) dili gerçekleştiri. Bunu son kullanıcılar tarafında kolaylıkla özelleştirilebilecek Python programları yazmak için kullanabilirsiniz.

Ayar dosyası [section] başlığıyla sağlanan bölümler ve onu takip eden isim: değer girdileri içerir; isim=değer şeklinde de kullanılabilir. Aradaki boşluklar gözardı edilecektir. '#' ya da ';' ile başlayan satırlar gözardı edilir ve yorum için kullanılabilir.


Yorumlar kendi başlarına boş bir satırda veya değerlerin ya da bölüm isimlerinin bulunduğu satırlarda bulunabilir. İkinci durumda yorum olduklarının anlaşılabilmesi için arada(yorumdan önce) boşluk bulunması gerekir. (Geriye uyumluluk için sadece ; satır içi yorum başlatır.)

Seçimli(optional) değerler aynı ya da özel bir DEFAULT bölümdeki başka değerlere işaret eden format stringleri içerebilirler.

Örneğin:

[Section]
foodir: %(dir)s/whatever
dir=frob
long: this value continues
   in the next line


burada %(dir)s dir 'in değerine sahip olacaktır(örnek için flob). Bütün referans genişletmeleri gerektiğinde gerçekleştrilir.

Öntanımlı(default) değerler ConfigParser yapıcısına sözlük tipinde bir parametre olarak verilebilir. Ek öntanımlılar diğer değerleri geçersiz kılacak get() metoduna verilebilir.Bölümler normalde dahili sözlükte saklanırlar. Alternatif bir sözlük ConfigParser yapıcısına parametre olarak verilebilir.

Örnekler:
Bir ayar dosyasına yazma örneği:

import ConfigParser

config = ConfigParser.RawConfigParser()

# When adding sections or items, add them in the reverse order of
# how you want them to be displayed in the actual file.
# In addition, please note that using RawConfigParser's and the raw
# mode of ConfigParser's respective set functions, you can assign
# non-string values to keys internally, but will receive an error
# when attempting to write to a file or when you get it in non-raw
# mode. SafeConfigParser does not allow such assignments to take place.
config.add_section('Section1')
config.set('Section1', 'int', '15')
config.set('Section1', 'bool', 'true')
config.set('Section1', 'float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'wb') as configfile:
    config.write(configfile)

Bir ayar dosyası okuma örneği:


import ConfigParser

config = ConfigParser.RawConfigParser()
config.read('example.cfg')

# getfloat() raises an exception if the value is not a float
# getint() and getboolean() also do this for their respective types
float = config.getfloat('Section1', 'float')
int = config.getint('Section1', 'int')
print float + int

# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
# This is because we are using a RawConfigParser().
if config.getboolean('Section1', 'bool'):
    print config.get('Section1', 'foo')


Ayrıntılı belgelendirme ve daha fazla örnek için:http://docs.python.org/library/configparser.html

6 Kasım 2010 Cumartesi

PyQt'yi Etkileşimli(interactive) Kullanmak

    PyQt ile ilgili olarak Qt kodunun etkileşimli olarak kodlanabileceğini öğrendim. Qt'de yeni bir şeyler öğrenirken çok işe yarayabilecek bir özellik. Şöyle ki konsoldan python yazarak Python yorumlayıcısını açalım. 
    Şimdi basit bir pencere yaratalım(kodun kopyalanabilmesi için >>> kullanılmadı):
PyQt4.QtCore import *
from PyQt4.QtGui import *
app = QApplication([])
window = QWidget()
window.resize(400, 300)
window.show()
  
    Şöyle pencere göreceksiniz:
    Hadi bir buton ekleyelim:
button = QPushButton("Tikla!", window)
button.show()
  
    İşte interaktif şekilde butonumuzu ekledik:
    Şimdi de butonumuzu pencerenin ortasına alalım:

layout = QHBoxLayout(window)
layout.addWidget(button)

    Şimdi addStretch() özelliğinin görünüme etkisine bakalım:
layout.addStretch()


    Ve kolaylıkla butonumuzun tıklanma(clicked) özelliğine bir slot bağlayabiliriz(ifade biraz karışık oldu :| ):

def mySlot():
    print "Buton Tiklandi"
button.clicked.connect(mySlot)

    Görüldüğü üzere Qt'yi denemek için iyi bir yöntem.

Kaynak:http://pysnippet.blogspot.com/2010/11/getting-interactive-with-pyqt.html

5 Kasım 2010 Cuma

Python'da Socket Programlama


    Socketler ve portlar ağlarla ilgili çoğu programın temelini oluşturur. Soketler, bir tür süreçler arası haberleşme(interprocessing) yöntemidir. Soket, soyut bir tanımla haberleşme uç noktalarıdır. Pratik olarak soketler dosyalara benzer. Soketten okumak ile dosyadan okumak arasında hiçbir fark yoktur. Socketler için üç alan(domain) tanımlanmıştır:
    Unix Alanı/Dosya-Sistemi Alanı : Bu alandaki socketler bir sistemde iki veya daha süreç birbiriyle haberleşeceği zaman kullanılır. Socketler dosya sistemi içinde yaratılırlar. /var/lock/sock ya da /tmp/sock gibi yerel yolları içerecek şekilde string olarak gösterilirler
    İnternet Alanı : Bu alan TCP/IP üzerinden haberleşen süreçleri göstermektedir. Bu alanda yaratılan socketler (host, port) çiftleri şeklinde gösterilmektedir. Host, string ya da IP adresi şeklinde gösterilebilen host ismidir. Port ise o host üzerinde bağlanılacak portun sayısal değeridir.
    NS Alanı : Bu artık kullanılmayan Xerox protokolü üzerinden haberleşen süreçler için kullanılır.

    Bunlardan sadece ilk ikisi çoğunlukla kullanılmaktadır. Python hepsini destekler. Aşağıda TCP/IP socketleri kullanan bir uygulama yaratmak için gerekli adımlar sıralanmıştır:
    1. Socketi yaratmak (create)
    2. Sockete bağlanmak (connecting)
    3. Socketi bir adrese bağlamak (binding to an address)
    4. Bağlantıları dinlemek ve kabul etmek (listening and accepting connections)
    5. Veri göndermek/veri almak (transffering and recieveing  data)

    Bir socket yaratmadan önce kütüphanelerin yüklenmesi gerekir. socket modülü socketlerle çalışmak için gerekli herşeyi içerir.

    1. Socket Yaratmak
    Python'da socket yaratmak için socket() metodu kullanılır. 
socket(family, type, [protocol])
  • family : family parametresi socketin hangi alan için yaratıldığını belirtir. Birçok seçenek mevcuttur. Genel kullanılanlar ise Unix alanı için AF_UNIX ve internet alanı için AF_INET.
  • type : type kullanılacak protokol tipini belirtir. Tip TCP gibi bağlantı yönelimli (connection-oriented) ya da UDP gibi bağlantısız (connection-less) olabilir. TCP için SOCK_STREAM, UDP için SOCK_DGRAM sabitleri tanımlanmıştır. Diğer geçerli seçenekler ise SOCK_RAW, SOCK_SEQPACKET ve SOCK_RDM.
  • protokol : Bu parametre genellikle varsayılan değer olan 0 olarak bırakılır.
    Bunlar göz önüne alındığında internet alanı bir socket yaratmak için:
s = socket.socket(AF_INET, SOCK_STREAM)

    2. Sockete bağlanmak
    Yaratılan socketler sunucu-taraflı (server-side) ya da istemci-taraflı (client-side) olarak kullanılabilir. Sunucu-taraflı kullanılacaksa bir hosta bağlanması gerekir. Bunu socket nesnesinin connect() metodu ile gerçekleştiririz. connect() metodu host adresini ya da host adresi ve port numarasından oluşan (host, port) şeklinde bir ikiliyi kabul eder. Örneğin adresi 192.168.51.102 ve port numarası 8080 olan bir hosta bağlanmak için:
s.connect(("192.168.51.102", 8080))

    3. Socketi bir adrese bağlamak
    Eğer sunucu-taraflı kullanılacaksa socketin bir adres ve porta bağlanması gerekir. Bunun için bind() metodu kullanılır. bind() metodu parametre olarak socketin bağlanacağı adres ve gelen istekleri dinleyeceği port numarasından oluşan (host, port) şeklinde ikiliyi alır. Örnekse:
s.bind(("192.168.51.107, 8080))

    4. Bağlantı dinlemek ve kabul etmek
    Socket belli bir adrese bağlandıktan sonra, belirtilen porttan gelen istekleri dinlemek için görevlendirilmesi gerekir. Bu amaçla listen() metodu kullanılır. Parametre olarak kaç bağlantının kabul edileceğini alır. En az 1 olamalıdır. Aşağıda 2 bağlantı kabul edilmiştir:
s.listen(2)

    Yapılması gereken sonraki adım bağlantıları kabul etmektir. Bunun için accept() metodu kullanılır. Geriye istemciyi temsil eden bir socket nesnesi ve istemcinin adresini döndürür:
istemsock, adres = s.accept()

    5. Veri göndermek/veri almak
    Veri recv() ve send() metodlarıyla aktarılabilir. recv() metodu sunucu ya da istemciden gönderilen veriyi almak için kullanılır. Parametreler tampon boyu (buffer size) ve bayraklardır (flags). Bayraklar isteğe bağlıdır. Veri almak için kod:
tampon = 1024
s.recv(tampon)

    Veri göndermek içinse send() metodu çağrılır. Parametre olarak gönderilecek veri ve bayrak alır. Örnekse:
veri = raw_input(">>")
s.send(veri)

    Python'un socket dökümantasyonunda bulunan sunucu ve istemci örneğiyse şu şekilde:
    Sunucu:

# Echo server program
import socket
import sys

HOST = None               # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                              socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except socket.error, msg:
        s = None
        continue
    try:
        s.bind(sa)
        s.listen(1)
    except socket.error, msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

    İstemci:




# Echo client program
import socket
import sys

HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
    af, socktype, proto, canonname, sa = res
    try:
        s = socket.socket(af, socktype, proto)
    except socket.error, msg:
        s = None
        continue
    try:
        s.connect(sa)
    except socket.error, msg:
        s.close()
        s = None
        continue
    break
if s is None:
    print 'could not open socket'
    sys.exit(1)
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)


Kaynak ve Bknz:http://www.devshed.com/c/a/Python/Sockets-in-Python-Into-the-World-of-Python-Network-Programming/
http://docs.python.org/library/socket.html
http://cekirdek.uludag.org.tr/~meren/belgeler/socket/socket.htm