Os.system çıktısını StringIO yönlendirmek

Merhaba;
os.system fonksiyonu bildiğiniz üzere komut satırına komut göndermeye yarıyor. Ancak ben sys.stdout’u StringIO nesnesine yönlendirdiğim halde os.system çıktısı orijinal sys.stdout’a yönlendiriliyor:

>>> import os, io, sys
>>> IO = io.StringIO()
>>> sys.stdout = IO
>>> os.system("echo Merhaba")
Merhaba
>>> "!?"
'!?'

Ben bunun çıktısını nasıl yönlendirebiliriz?

Komut satırında deneyin.

Özür dilerim tam anlamadım?

Komut satırı(cmd, terminal, uç birim) nde deneyin. Bazen idle yetersiz kalabiliyor o yüzden cmd’de denemek daha yararlı.

1 Beğeni

Orada denedim zaten.

Pardon o zaman, >>> görünce idle dan yazdınız sandım kusra bakmayın

1 Beğeni

Esteğfirullah, ama o >>> lar normal konsolda da var.

1 Beğeni

Hangi konsol o, merak ettim.

Sorunuza gelirsek şurada belirtildiği üzere standart giriş ve çıkışın değiştirilmesi os.system’ın girdi ve çıktısının nereden alınıp nereye verileceğini değiştirmiyor. Yapmak istediğinizi yapabilmek için şunun gibi bir yol kullanmanız gerekiyor:

Tamam teşekkür ederim, ama ben sanırım başka bir modül kullanacağım.

Hocam aslına bakarsak değiştiriyor :slight_smile: Eğer konsola gönderilen yazı biçimlendirilmiş, yani renkliyse yazı konsolda kalıyor, normal ve renksiz olması gerek. Mesela ben terminale pip install pynput komutunu gönderdiğimde yalnızca Collecting pynput yazısını alabiliyorum. (Eğer internet bağlantısı yoksa) çünkü bağlantı yoksa diğer yazılar sarı oluyor ve popen sınıfının read metodu renkli yazıları döndürmüyor. Böyle olmaması için biraz daha derine inmem gerekecek :smile:

Renkli olarak döndürülmesi için, çıktının renk kodlarını yakalayabiliyor olmanız gerekiyor. Bu da programa bağlı. Mesela aşağıdaki programın çıktısını alıp ekrana yazınca renkli çıktıyı görebiliyorum.

Programım(main.py)

print("\033[32mNormal\033[0m")

Çıktı aldığım komut

import os
a = os.popen("python main.py").read()
print(a)

Bu şekilde ekrana renkli olarak yazıyor. Aynı şekilde “ls” komutunu ele alalım.

a = os.popen("ls").read()
print(a)

Renkli çıktı görünmüyor. Ancak şu şekilde yazarsam

a = os.popen("ls --color").read()
print(a)

Renkli olarak görebiliyorum :slight_smile:

2 Beğeni