Bu eğitimde, getopt, sys ve argparse modüllerini kullanarak komut satırından veya terminalden bir ya da daha fazla argümanı nasıl ayrıştıracağınızı öğrenin.
Bir veri bilimi ya da makine öğrenmesi projesi planlıyorsanız, Jupyter Notebook ile geliştirmeye başlamak sık görülen bir durumdur. Etkileşimli bir çalışma ortamı sunar, modüllerinizi hızlıca çalıştırmanızı sağlar vb. Özellikle veri bilimi ya da makine öğrenmesi projeleri için Jupyter Notebook'ları birincil aracınız olarak seçmeniz için birçok neden vardır. Ancak bu eğitim, bu kısmı ele almayı amaçlamıyor.
Diyelim ki veri bilimi projenizde veri alımı yapmak için bir Python betiğini toplu iş olarak çalıştırmanız gerekiyor. Ya da bir makine öğrenmesi modelini uzak bir sunucuya dağıtmak için bir Python betiği çalıştırmanız gerekiyor. Bu gibi durumlarda yalnızca python your_script.py komutunu yürütmek yeterli olmayabilir. python your_script.py ile birlikte daha fazla seçenek veya argüman geçirmeniz gerekebilir. Linux terminalinde komut çalıştırırken (ör. ps, ls vb.) ek argümanlar kullanmaya zaten aşina olabilirsiniz.
Bu eğitimde, bir Python betiğiyle birlikte komut satırından geçirilen ek argümanları ve seçenekleri nasıl ayrıştıracağınızı öğreneceksiniz. Bugünkü eğitimin içeriğinin özeti şöyle:
Argüman ayrıştırmaya kısa bir giriş
Python'da argüman ayrıştırma
sys.argv kullanımı
getopt kullanımı
argparse kullanımı
Not: Bu eğitim, Python'a temel düzeyde aşinalık varsayar.
Argüman ayrıştırma nedir?
Bir Linux kullanıcısıysanız bunu zaten biliyor olabilirsiniz, iddiaya girerim. Belirli bir dizinde bulunan dosya ve klasörlerin özetini almak için sıkça ls komutu kullanılır. ls komutunun tipik bir çıktısı şöyle görünür -
Ancak, ls komutuna pek çok seçenek verebilirsiniz; örneğin -l. Bunun çıktısı şöyle görünür -
-lseçeneğini geçirerek daha fazla bilgi elde ettiniz. Burada seçenek ile argüman arasında küçük bir fark vardır. Geçerli çalışma dizininizden bir dosya ya da klasörü kaldırmak için genellikle rm komutu kullanılır. Diyelim ki demo.txt adlı bir metin dosyanız var ve bu dosyayı kaldırmak için rm demo.txt komutunu çalıştırdınız. Bu durumda demo.txt, rm komutuna uyguladığınız argümandır. rm komutuna herhangi bir argüman geçirmezseniz, şöyle bir hata alırsınız -
Peki bir seçenek ile bir argüman arasındaki fark nedir? Artık oldukça açık. Seçenekler geçilmesi isteğe bağlı olan, argümanlar ise (çoğunlukla) geçilmesi gerekli olan ögelerdir. ls komutuna herhangi bir şey geçirmeniz, onun çıktı üretmesi için şart değildir.
ls -l ya da rm demo.txt yazdığınızda, işletim sistemi bunları arka planda belirli bir şekilde ayrıştırır. Bu mekanizma genellikle işletim sistemi geliştiricileri tarafından belirlenir ve ayrıştırma olarak adlandırılır.
Daha fazla Linux komutu ve destekledikleri farklı seçenekler ile argümanları öğrenmekle ilgileniyorsanız, Unix Concepts and Applications kitabını okumanız şiddetle tavsiye edilir.
İşte argüman ayrıştırmaya temel bir giriş. Neredeyse tüm programlama dilleri argüman ayrıştırmayı destekler. Python da bir istisna değil. Python'da argüman ayrıştırmayı yapabileceğiniz üç yaygın yol vardır -
sys.argv
getopt
argparse
Şimdi yukarıdaki seçeneklerin her birini tek tek ele alacak ve bunları argümanları (ve seçenekleri) ayrıştırmak için nasıl kullanacağınızı göreceksiniz. Kronolojik gidelim.
sys.argv kullanarak Argüman Ayrıştırma
Basit başlayalım. Bu ilk örnekte demo1.py adlı bir Python dosyası oluşturacaksınız. Programınız, çalıştırılırken komut satırından (veya terminalden) geçirilen rastgele sayıda argümanı kabul edecek. Program, geçirilen argümanları ve toplam argüman sayısını yazdıracak.
Örneğin, python demo1.py abc 123 komutunu çalıştırırsanız, program şu çıktıyı verecektir -
Number of arguments: 3
Argument(s) passed: ['demo1.py', 'abc', '123']
İlk argümanın her zaman Python dosyasının adı olduğuna dikkat edin. Ancak kod, bunu dahil etmeyecek şekilde değiştirilebilir.
Şimdi koda gelelim -
import sys
print('Number of arguments: {}'.format(len(sys.argv)))
print('Argument(s) passed: {}'.format(str(sys.argv)))
Önce Python'un standart kurulumuyla gelen sys modülünü içe aktardınız. Ardından bir Python betiğine geçirilen argümanların listesini döndüren argv alt modülünü kullandınız; burada argv[0] Python betiğinin adını içerir. Aşağıdaki gibi bir kod hücresinde sys.argv çalıştırırsanız, IPython çekirdeğinin düzgün çalışmasını sağlayan yapılandırma dosyalarının listesini elde edersiniz. Onlarla oynamamak en iyisidir.
Şimdi argümanları (ve seçenekleri) ayrıştırmak için getopt modülünü nasıl kullanacağımızı görelim.
getopt kullanarak Argüman Ayrıştırma
sys.argv ile karşılaştırıldığında, getopt modülü çok daha fazla esneklik sunar. Önce örnek bir senaryo tasarlayalım ve koda göre yazalım.
Diyelim ki bir Python betiği yayımladınız ama henüz belgelemediniz. Ancak kullanıcılar bu betiği amaçlanmadığı şekilde çalıştırdığında onlara anlamlı geri bildirim sağlamak istiyorsunuz. Python betiğiniz basitçe iki sayıyı toplar ve bir çıktı üretir. Tek kısıt, kullanıcıdan girdileri, Python betiğiyle birlikte komut satırı argümanları biçiminde geçmesini istemenizdir.
Biraz daha pratik konuşacak olursak, betik ideal olarak şöyle çalıştırılmalıdır -
python add_numbers.py -a 3 -b 8
Çıktı 11 olmalıdır. Burada -a ve -b seçeneklerdir; 3 ve 8 ise betiğe sağladığınız argümanlardır. Seçenekler yalnızca okunabilirliği artırmakla kalmaz, aynı zamanda değerlendirme akışına karar vermeye de yardımcı olur (toplama yerine bölme yaptığınızı düşünün). Önce koduna bakalım.
import getopt
import sys
# Get the arguments from the command-line except the filename
argv = sys.argv[1:]
sum = 0
try:
# Define the getopt parameters
opts, args = getopt.getopt(argv, 'a:b:', ['foperand', 'soperand'])
# Check if the options' length is 2 (can be enhanced)
if len(opts) == 0 and len(opts) > 2:
print ('usage: add.py -a <first_operand> -b <second_operand>')
else:
# Iterate the options and get the corresponding values
for opt, arg in opts:
sum += int(arg)
print('Sum is {}'.format(sum))
except getopt.GetoptError:
# Print something useful
print ('usage: add.py -a <first_operand> -b <second_operand>')
sys.exit(2)
Fikir, önce tüm argümanları sys.argv ile almak ve ardından buna göre işlemek. Şimdi en önemli kod satırına gelelim - opts, args = getopt.getopt(argv, 'a:b:', ['foperand', 'soperand'])
getopt() yönteminin imzası şu şekildedir:
getopt.getopt(args, shortopts, longopts=[])
args, komut satırından alınan argümanların listesidir.
shortopts, seçenek harflerini belirttiğiniz yerdir. a: sağlarsanız, bu betiğinizin a seçeneğiyle ve ardından değer olarak bir argümanla beslenmesi gerektiği anlamına gelir. Teknik olarak burada istediğiniz sayıda seçenek kullanabilirsiniz. Bu seçenekleri komut satırından geçirirken başlarına '-' gelmelidir.
shortopts değerini a:b: olarak tanımladınız; bu da Python betiğinizin 'a' ve 'b' olmak üzere iki harfli seçenek alacağı anlamına gelir. ':' belirterek bu seçeneklerin ardından argüman geleceğini açıkça söylüyorsunuz.
longopts değerini ['foperand', 'soperand'] olarak tanımladınız; bu da kodunuza, a ve b seçenekleri yerine f_operand ve s_operand kabul etmesini söylemenin bir yoludur. Ancak bunların her zaman -- ile kullanılması gerekir.
getopt modülü, kullanıcıya Python betiğinizi nasıl kullanacağını göstermek için faydalı iletiler tanımlamanıza yarayan kullanışlı bir GetoptError İstisna sınıfı da sağlar. Bu nedenle betiğinizin işlevsel kısmını bir try bloğuna aldınız ve except bloğunu buna göre tanımladınız.
Python betiğini şu şekilde çalıştırabilirsiniz:
Not: Yukarıdaki betik longopts işlemek üzere tanımlanmamıştır. Bunu bir alıştırma olarak deneyebilirsiniz.
Şimdi argüman ayrıştırma için argparse kullanımına bakalım.
argparse kullanarak Argüman Ayrıştırma
Yukarıdaki iki seçeneğe bakarak, bunların çok okunaklı olmadıkları aşikâr. argparse'ı çalışırken gördüğünüzde, bu iki seçeneğin esneklik konusunda da geride kaldığına katılacaksınız. argparse kullanımını anlamak için, yukarıdaki bölümde gördüğünüz senaryoyu uygulayan bir kod parçacığıyla başlayalım.
import argparse
# Construct the argument parser
ap = argparse.ArgumentParser()
# Add the arguments to the parser
ap.add_argument("-a", "--foperand", required=True,
help="first operand")
ap.add_argument("-b", "--soperand", required=True,
help="second operand")
args = vars(ap.parse_args())
# Calculate the sum
print("Sum is {}".format(int(args['foperand']) + int(args['soperand'])))
Her şeyden önce, yukarıda tartışılan diğer iki modül gibi argparse da Python'un standart kurulumuyla gelir. argparse nesnesini oluşturarak başlarsınız. Geri kalanını yazmaksa çok daha kolay hale gelir. Örneğin şu kod satırını ele alalım -
Burada, betikle birlikte sağlanmasını beklediğiniz argümanı eklediniz. Argümanın harf sürümünü ve genişletilmiş sürümünü birlikte verdiniz. required=True belirterek kullanıcıdan o belirli argümanı mutlaka sağlamasını açıkça istiyorsunuz. Son olarak, kullanıcı betiği doğru şekilde çalıştırmazsa gösterilecek anlamlı bir açıklama eklediniz.
İkinci argüman için tanım kısmı da aynıdır. Verilen argümanlara, ilgili anahtarları belirterek erişirsiniz.
Yukarıdaki kod parçacığı, komut satırı argüman ayrıştırma görevlerini argparse ile tanımlamanın ne kadar kolay ve esnek olduğunu açıkça gösteriyor. Yukarıdaki Python betiğiyle şöyle oynayabilirsiniz:
argparse ile sürecin ne kadar kolaylaştığına dikkat edin.
Sırada ne var?
Bugünkü eğitimi sonuna kadar okuduğunuz için teşekkürler. Artık Python betiğinizle birlikte komut satırından sağlanan argümanları ayrıştırabilen yerleşik Python modüllerine hakimsiniz. Bir alıştırma olarak, makine öğrenmesi ve veri bilimi projelerinizi argüman ayrıştırmayı kolaylaştıracak şekilde özelleştirip faydalı betik araçlarına dönüştürebilirsiniz. Yalnızca makine öğrenmesi veya veri bilimi değil; bunun yeterince ilgili olduğunu düşündüğünüz her yerde kullanabilirsiniz. Bugünkü eğitim bu kadar. Python becerilerinizi geliştirmekle ilgileniyorsanız, DataCamp'in Python Data Science Toolbox (Bölüm 1) kursuna göz atabilirsiniz.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!