2011-09-04 12 views
5

'da temizlenmesine nasıl karar verdim Yazdığım bazı kodları ayıklamaya çalışıyorum, bu da çok sayıda paralel işlem gerektirir. Ve sys.stdout çıkışını içeren bazı istenmeyen davranışlar var ve belirli iletiler iki kez yazdırılıyor. Hata ayıklama amacıyla, belirli bir noktada sys.stdout'un temizlenip temizlenmediğini bilmek çok yararlı olacaktır. Bunun mümkün olup olmadığını merak ediyorum ve eğer öyleyse, nasıl?Sys.stdout'un Python

Ps. Önemli mi bilmiyorum ama OS X kullanıyorum (en azından bazı sys komutları işletim sistemine bağlıdır).

+6

Sızdırılmış veya sys.stdout, süreçler arasında (ve aynı işlemdeki iş parçacıkları arasında bile olsa) garantili bir sipariş vermeyecektir. Neden doğru zaman damgaları ve günlük iletilerini her birinden ayrı olarak eklemezseniz, veya daha da iyisi, hepsinin hata ayıklama iletilerini threadafe veya interprocess kuyruğuyla göndermesine neden gerek yok? – James

+0

Sorun, aynı çıkışın iki kez gerçekleşmesidir, bu nedenle zaman damgası eklenmesi e.t.c. gerçekten yardım etmeyecek. Ayrıca sys.stdout'u özel bir şeye dönüştürmek, bu gerçekten tampon ile ilgili bir sorun olduğundan yardımcı olmaz. Eğer her şeyi başlatırsam python süreçlerini -u bayrağıyla anlayamadım. Bazı IO'lardan sonra, her zaman tamamen kızarmak yerine, tam olarak ne olduğunu bilmek isterim; çünkü bu, sorunun özünü anlamadan çirkin bir çözüm olacaktır. – koffie

cevap

1

Yanıt: (ciddi bir çirkinlik, harici bir C modülü veya benzeri olmadan) söyleyemezsiniz.

Nedeni, python’un dosya uygulamasının FILE * için C (stdio) uygulamasına dayanmasıdır. Dolayısıyla, temel bir python dosya nesnesi temel olarak sadece açılmış olan FILE'a bir başvuru içerir. Verileri yazarken C-uygulaması veri yazıyor ve bunu flush() python'a anlattığınız zaman aynı zamanda sifon aramayı da yönlendiriyor. Yani python bilgiyi tutmuyor. Temel C katmanı için bile, hızlı bir arama, bu bilgilere erişmenizi sağlayan belgelendirilmiş bir API olmadığına karar verdi, ancak muhtemelen FILE nesnesinde bir yere sahip olduğu için, bu, eğer umutsuzca ihtiyaç duyulduysa, teoride okunabilirdi.

+0

Teşekkürler, kötü olursa bu mümkün olsa çok fazla sorun. Bunu sadece hata ayıklama pruposları için tanımak istediğimden, sadece sys.stdout.flush() ifadelerine reklam verdim ve programımın davranışının değişip değişmediğine karar verdim. Eğer değiştiyse, o noktada temizlenmediğini varsaydım. – koffie