Merhaba arkadaşlar sizlerle faydalı olduğunu düşündüğüm bir konuyu paylaşmak istedim. Bloğumda bulunan bu yazıyı r10 kitlesine saygılarımda sunarım.
Python sh ile shell komutlarını çalıştırmak
Bu yazıda python ile web uygulamalari geliştirirken linux sistem üzerinde shell komutlarını nasıl icra edebileceğimizden bahsedeceğim. Shell komutlarını python üzerinden icra etmek için yanlızca sh librarysini projenize import etmeniz yeterli.
Basit komut örnekleri
import sh
print(sh.ls("/"))
# Bir önceki örneğin farklı yolu
from sh import ls
print(ls("/"))İçerisinde / içeren program yollarını çalıştırmak için örneğin :/usr/bin/google-chrome
sh.google_chrome(
http://google.com) şeklinde çalışılabilir.
Burada google-chrome ismindeki - yerine _ kullanıldığına dikkat edilmelidir.
İçerisinde özel karakterler içeren komutların çalıştırılması
Örneğin bir .sh uzantılı shell scriptinizi çalıştırmak istiyorsunuz.
run = sh.Command("/home/amoffat/run.sh")
run()komutu ile bu işi gerçekleştirebiliriz.
Parametre kullanmak
curl("http://duckduckgo.com/", "-o", "page.html", "--silent")
parametre kullanırken komut içerisinde fonksiyona parametre nasıl veriyorsak o şekilde verebiliyoruz. Zaten komutlar bir fonksiyon gibi yazılıyor.
Arkaplanda Çalıştırmak
Linux sistemlerde uzun süren işlemleri sunucuyu meşgul etmemesi için arkaplanda çalıştırmak gerekebilir. Aşagıdaki örnekte ilk olarak 3 saniye uyutulur sonra print yapılır. ikinci blokta ise
3 saniye uyutulma işlemi arkaplana atılır bu nedenle print yazılması için hiç beklenmez.
# blocks
sleep(3)
print("...3 seconds later")
# doesn't block
p = sleep(3, _bg=True)
print("prints immediately!")
p.wait()
print("...and 3 seconds later")Piping İşlemi
Çoğu shell komutlarımızda pipe operatörüne ihtiyaç duyarız. Bunun kullanımı oldukça basit. Komutlarda en önce icra edilecek olan en içe en son icra edilecek olan en dışa yazılır.
# sort this directory by biggest file
print(sort(du(glob("*"), "-sb"), "-rn"))
# print(the number of folders and files in /etc
print(wc(ls("/etc", "-1"), "-l"))STDIN İşlemi
STDIN işlemi bir processe devreder. Farklı processlerde nasıl çalışacağını belli argümanlarla belirtiriz. Bu argümanlardan bazılarını sizin için anlattım.
_bg : komutu arkaplanda çalıştırır.
_out : stdout geri döndürdüğü değeri basar. ör. log basma
p = tail("-f", "/var/log/some_log_file.log", _out=process_output)
_iter : döngü içeren komutlarda kullanılır.
for line in tail("-f", "/var/log/some_log_file.log", _iter=True):
_timeout : processin ne kadar süre içerisinde bitmesi gerektiğini veriyoruz. Eğer bitmezde SIGKILL ile process öldürülür.
Sub-Command
Shell arayüzünde bir programı kullanmak istediğimizde programın bir çok alt komutunu kullanmak durumunda kalırız. Bunun için sh library bize mükemmel bir kolaylık sunuyor. Bir örnek ile açıklayalım.
Ben virtual box ile bütün virtualmachinelerin listesini almak istiyorum. Bunun için komut satırına yazmam gereken komut : vboxmanage list vms.
Sh ile yazmam gereken komut :
from sh import vboxmanage
vboxmanage.list.vms()
İşler karmaşıklaştığında bu komut yapısı bizi büyük dertlerden kurtaracaktır. Argüman kullanmak istediğimizde nasıl bir örnek yapacağımıza göz atalım son olarak.
Virtualboxa taktığım bir usb deviceın özelliklerini aldığım komut. Komut içten dışa doğru parametreleriyle birlikte çalıştırılmaktadır. Bunu bir python scriptin içinde kullanabilirsiniz. İşin içine regex ve komplex komutlar girdiğinde sh library neden bu kadar önemli anlaşılmış oluyor.
sed(sed(grep(grep(sudo.vboxmanage.list.usbhost(),"-A","2", serial),"Current\ State"),"-e s/Current\ State://g"),"s/^ *//").strip()
Ve anlatacaklarım bu kadar.
Önemli bir hatırlatma! sudo komutunu kullanıyorsanız çalıştıracağınız uygulamaların kullanıcı izinlerini sudoers dosyasında NOPASSWD olarak tanımlamış olmalısınız. Basit bir örnek :
username ALL = NOPASSWD: /etc/init.d/apache2
apache için parolasız sudo komutu kullanma iznini verir.
Yazının Orjinaline buradan ulaşabilirsiniz:
http://yazilimportal.com/python-sh-i...i-calistirmak/
Umarım faydalı olmuştur.
Yazıyı yazmak için bilgi edindiğim sh library dökümantasyonunada buradan erişebilirsiniz.