Python 3.x’te Kullanışlı bir Araç: crlf.py
Python, hepimizin bildiği gibi, pek çok platformda çalışabilen bir dildir. Ayrıca Python’da yazılmış bir program, çoğunlukla üzerinde hiç bir değişiklik yapılmadan birden fazla platform üzerinde çalıştırılabilir (tabii programımızı yazarken bazı noktalara dikkat etmek kaydıyla…).
Ancak Python’un bu “taşınabilme kabiliyetini” (portability) zora sokan bazı şeyler de yok değildir… Ben bu yazıda, Python’un taşınabilme gücünü azaltan bir noktaya değineceğim.
Normal olarak bir metin dosyasına herhangi bir şey yazarken, alt satıra geçmek için “enter” tuşuna bastığımız zaman, satır sonları “\n” imiyle işaretlenir. Mesela şöyle bir şey yazdığımızı düşünelim:
#!/usr/bin/env python3.0
print("Elveda Zalim Dünya!")
Şimdi bu betiği .py uzantılı olarak kaydedelim. Daha sonra etkileşimli kabukta bu dosyayı okuyalım:
>>> f = open("deneme.py")
>>> f.read()
Buradan alacağımız çıktı şöyle bir şey olacaktır:
'#!/usr/bin/env python3.0\nprint("Elveda Zalim Dünya!")\n'
Gördüğünüz gibi, satır sonları “\n” kaçış dizisi ile gösteriliyor. Ancak aslında bu Unix tarzı bir satır sonlandırma biçimidir. Özellikle Windows platformunda bazı metin düzenleyiciler satır sonlarını daha farklı bir şekilde işaretliyor. Yani Windows platformunda yazdığınız bir betik, yukarıdaki “read()” metoduna şöyle bir cevap verebilir:
'#!/usr/bin/env python3.0\r\nprint("Elveda Zalim Dünya!")\r\n'
Gördüğünüz gibi, satır sonları “\n\r” şeklinde çıkıyor. Satır sonlarının bu şekilde gösterildiği bir betiği Windows’tan GNU/Linux’a taşıdığınız zaman, betiğin ilk satırı “#/usr/bin/env python3.0″ olsa ve siz bu betiği “çalıştırılabilir” olarak ayarlasanız dahi, bu betik “./deneme.py” gibi bir komut yardımıyla konsoldan çalıştırılamayacaktır. Betiği bu şekilde çalıştırmayı denediğinizde konsoldan şöyle bir cevap alabilirsiniz:
: No such file or directory
Halbuki siz “böyle bir dosya veya dizinin” varolduğunu biliyorsunuz… İşte burada sorun biraz önce bahsettiğimiz satır sonu karakterlerinin farklı olmasından kaynaklanıyor. GNU/Linux kabuğu satır sonunda sadece “\n” yerine “\n\r” görünce kafası karışıyor. Dolayısıyla betiğimizi çalıştıramıyor. Bizim burada yapmamız gereken şey satır sonlarının hepsini “\n” şekline çevirmek. İşte başlıkta adı geçen “crlf.py” bu iş için yazılmış bir Python betiğidir. Bu betik, “python3.0/examples/Tools” yolu içinde bulunur. Mesela benim sistemimde bu betiğin bulunduğu tam yol şöyle:
/usr/share/doc/python3.0/examples/Tools/scripts/crlf.py
Eğer Python’u kaynaktan kurmuşsanız, bu betik muhtemelen şu yol üstünde olacaktır:
/Python-3.0.1/Tools/scripts/crlf.py
Peki bu betiği nasıl kullanacağız? İşin ilginç yanı, bu betik Python3.0 dizini altında bulunuyor olsa da aslında Python’un 3.x sürümleriyle uyumlu değil! Dolayısıyla bu betiği “python3″ ile değil “python” ile çalıştıracağız. Mesela satır sonları problemli, “deneme.py” adlı bir betiğimiz olduğunu varsayalım. Bu betiğin satır sonlarını şu komut yardımıyla düzeltiyoruz:
python /usr/share/doc/python3.0/examples/Tools/scripts/crlf.py deneme.py
Bu işlemden sonra aynı dosyaya “read()” metodunu uyguladığımda bütün “\r\n” işaretlerinin “\n”ye dönüştüğünü görüyorum. Artık betiğimi GNU/Linux üzerinde rahatlıkla çalıştırabilirim.
Bu tür sorunlarla karşılaşmamak için, programlarımızı yazacağımız metin düzenleyici veya “IDE”leri çok iyi seçmemiz gerekir. Kullandığınız aracın satır sonlarını nasıl işaretlediğini mutlaka kontrol edin. Aksi halde yazdığınız programlar, basit bir nedenden ötürü farklı platformlar üzerinde çalışmayacaktır.
Örneğin Windows’taki “Notepad++” adlı düzenleyicinin, satır sonlarını “\r\n” şeklinde işaretlediğini biliyorum. “IDLE” ise satır sonlarını “\n” şeklinde işaretler. Dolayısıyla Notepad++ ile yazdığınız programlar “taşınabilir” olmazken, IDLE ile yazdığınız programlar “taşınabilir” olacaktır…
Son Yorumlar