dersblog

Python ve Komut Satırına Erişmek, Popen

Script yazarken bazen ihtiyaçlardan biri python script'i içinde bir shell script işletebilmek. Çıktısı işlenmeyenler için os.system(komut) yetiyor tabii. Fakat komut çıktısını göstermek istiyorsak?

import os
res = os.popen("ls -al")

kullanımı basit - fakat tedavülden kalkacakmış (deprecated), bu yüzden kalıcı kodları ona bağlı yazmak iyi olmaz. Kütüphane şubprocess tavsiye ediliyor,

import subprocess 
p = subprocess.Popen(['ls','-al'], stdout=subprocess.PIPE)
res = p.stdout.read()
print (res)

İş biraz daha zorlaştı ama kullana kullana alışılabilir.

Bir diğer ihtiyaç komut "işlerken" onun çıktısını iterator ile gezebilmektir. Belki komut yavaş işleyecektir, beklerken belki o ana kadar olan çıktıyı işlemek / ekrana basmak ve yan bazı işlerle uğraşmak isteyebiliriz. Bunu da subprocess ile yapabiliyorsunuz,

p = subprocess.Popen(['ping','-c','3','localhost'], stdout=subprocess.PIPE)
for line in p.stdout:
    print line

Üstteki komut her satırı ayrı ayrı, Python döngüsü içinde basacak.

Hata mesajlarını ekrana basmak için stderr ile çalışmak lazım, mesela alttaki komut bir derleme gcc komutunu bilerek yanlış işletti, hata mesajı gösterilmesi lazım ama hiçbir şey görülmüyor,

cmd = ['gcc','-c','dkflakjsdlkas']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.read()
print (res)
b''

Hataları görmek için alttaki yaklaşım gerekli,

import subprocess 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, shell=False)
(output, _) = process.communicate()
res = str(output).split("\\n")
for x in res: print (x)
b'gcc: error: dkflakjsdlkas: No such file or directory
gcc: fatal error: no input files
compilation terminated.
'

Yukarı