Pythona yeni başladım, bir sorun ile karşılaştım yardımcı olursanız sevinirim

Merhabalar Python’a programlama dilini öğrenmeye başladım öğrenirken belki sizlerin sorun olarak bile bakmayacağınız bir şey ile karşılaştım bu sorunuma yardım edebilirseniz sevinirim.
Aşşağıya kodları yazıyorum.

import sys
f = open(“deneme.txt”, “w”)
sys.stout = f
print(“deneme metni”, flush=True)
deneme metni

print(sys.stout, flush=True)
<_io.TextIOWrapper name=‘deneme.txt’ mode=‘w’ encoding=‘cp1254’

bunun sebebi nedir? Çıktıyı her print() fonksiyonunun çıktısını deneme.txt ye vermek istiyorum ancak olmuyor yine etkileşimli kabuğa veriyor.

Not: bazı kelime hatalarım olabilir kusuruma bakmayın programlamaya öğrenmeye yeni başladım.

Sanırım gözünüzden kaçmış.

sys.stout = f

kodunda stout yazmışsınız. Sadece d eklemeniz yeterli yani;

sys.stdout = f

olarak değiştirirseniz sorun çözülücektir

Soruna cevap degil (cevap yukarida yazilmis) ama:

Normalde stdout yonlendirmesi calistiran program tarafindan yapilir. Mesela herhangi bir kabukta (Windows’ta bile!) python hede.py > deneme.txt yazarsan programin stdout’u deneme.txt'ye yonlendirilir.

print fonksiyonu file parametresi aliyor. sys.stdout'u f'ye set etmektense f'yi sys.stdout veya deneme.txt'ye set edip print'lere hedefi f olarak gosterebilirsin.

1 Beğeni

teşekkürler gözümden kaçmış:smile:

sizede teşşekür ederim ama onu biliyorum gelgiğim konu sys.stdout’u kalıcı olarak değiştirmekti :smile:

Konudan bağımsız ama sys.stdout'u yönlendirmekle alakalı ekstra bir bilgi olarak burada durmasında sakınca yoktur umarım. Aşağıdaki de bir yönlendirme çeşidi.

Normalde sys.stdout'u aşağıdaki gibi bir listeye yönlendirebiliriz. Ancak sys.stdout'un kullandığı fonksiyonları kullanamayız. Kullanmaya kalktığımızda bir AttributeError hatası yükseltilir.

import sys

a = list()
sys.stdout = a

sys.stdout.write("hello")

Ama aşağıdaki gibi bir class yardımıyla sys.stdout'un write fonksiyonunun sadece adını kullanarak istediğimiz işlemi yapabiliriz.

import sys

save = sys.stdout


class Yonlendir:
    def __init__(self, text):
        self.text = text

    def write(self, string):
        # Buraya text'in tipine
        # bağlı olarak yazdırma işlemi yerine
        # yapılacak işlemler yazılmalı.
        if hasattr(self.text, "write"):
            self.text.write(string)
        elif hasattr(self.text, "append"):
            self.text.append(string)

    def flush(self):
        # Buraya text'in tipine
        # bağlı olarak, ``sys.stdout.flush()``
        # yerine kullanılacak bir işlem tanımlayabiliriz.
        if hasattr(self.text, "flush"):
            self.text.flush()
        else:
            pass

 
a = list()
sys.stdout = Yonlendir(a)
sys.stdout.write("Hello")
sys.stdout = save
print(a)
1 Beğeni

Teşekkür ederim tabikide bir sakınca yoktur hatta güzel oldu takılırsam bakarım buradan:smile: