SORU
5 Mart 2009, PERŞEMBE


Nasıl sys yinelenen.python ile bir günlük dosyası stdout?

Edit: Beri görünen var ya çözüm, ya da ben bir şey yapıyorum yani standart dışı olduğunu kimse bilmiyor - revize sorumu da sorayım: Nedir en iyi şekilde gerçekleştirmek günlük bir python uygulaması yapmak çok sistem çağrıları?

Benim app iki modu vardır. Etkileşimli modda, tüm çıkış bir günlük dosyası, herhangi bir sistem çağrıları çıktısı da dahil olmak üzere ekran olarak gitmek istiyorum. Daemon modunda, tüm çıkış günlüğüne gider. Daemon modu harika bir işletim sistemi çalışır.() dup2. "" Tüm çıkış etkileşimli modda bir günlük, her değiştirmeden ve her sistem çağrısı. tee için bir yol bulamıyorum

< / ^ hr .

Diğer bir deyişle, komut satırı 'tee' çıktı herhangi bir python uygulaması . tarafından oluşturulan işlevselliğini istiyorum ^strong>sistem çağrısı çıkışı da dahil olmak üzere.

Netleştirmek için:

Tüm çıkış yönlendirmek için böyle bir şey yapıyorum ve çok işe yarıyor:

# open our log file
so = se = open("%s.log" % self.name, 'w', 0)

# re-open stdout without buffering
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

# redirect stdout and stderr to the log file opened above
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())

Bu güzel tarafı özel baskı kodu geri kalanından aramalar gerektirmesidir. Kod da bazı shell komutları çalıştırır, onların güzel çıktı her biri ile uğraşmak zorunda tek tek de değil yani.

Sadece, aynısını yapmak istiyorum, hariçyinelenenyeniden yönlendirme yerine.

İlk bakışta, sadece dup2-geri çalışması gerektiğini düşündüm. Neden değil mi? İşte benim test:

import os, sys

### my broken solution:
so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())
###

print "kljhf sdf"

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

Dosya ".log" ekranında görüntülenen ne aynı olmalıdır.

CEVAP
5 Mart 2009, PERŞEMBE


Bu aynı sorunu daha önce de yaşadım ve bu parçacık çok yararlı buldu

class Tee(object):
    def __init__(self, name, mode):
        self.file = open(name, mode)
        self.stdout = sys.stdout
        sys.stdout = self
    def __del__(self):
        sys.stdout = self.stdout
        self.file.close()
    def write(self, data):
        self.file.write(data)
        self.stdout.write(data)

kimden: http://mail.python.org/pipermail/python-list/2007-May/438106.html

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • dcigs

    dcigs

    9 EYLÜL 2006
  • gsmaestro

    gsmaestro

    17 AĞUSTOS 2006
  • Paul Schroder

    Paul Schrode

    30 Kasım 2007