2009-12-24 53 views
5

stdout'un yönlendirildiği bir programım varsa, pdb'mn tümü yönlendirmeye gider, çünkü kitaplık stdout'a yazmak için yazılmıştır.en iyi yolu?

Çoğu zaman bu sorun zordur, bu da gerçekten bir girdi beklerken bir programın askıda kaldığını düşünmeme sebep olur.

İnsanlar bu konuda nasıl çalışır? (Maalesef, winpdb gibi diğer hata ayıklayıcılarını kullanmak bir seçenek değildir).

cevap

2

Buradaki sorun PDB Cmd sınıfını kullanır nerede olduğunu varsayılan olarak:

use_rawinput = 1 

Bu, Cmd'nin sys.stdout.readline() yerine varsayılan olarak raw_input() yöntemini konsoldan okumak için kullanacağı anlamına gelir. Bu, raw_input()'un geçmişi desteklediğinden (yalnızca readline modülü yüklüyse) ve diğer yararlı bitlerden dolayı yapılır. Tek sorun raw_input() bir senaryoyu varsa bu yüzden, yönlendirmeyi desteklemediği şudur: sıkışmış olacak o çıkış yönlendirme ile çalıştırırsanız,

#!/usr/bin/python 
name=raw_input("Enter your name: ") 

ve

> python test.py 
Enter your name: Alex 

çalıştırmak ama

Bu tam olarak PDB'nin kullandığı ve neden sıkıştığı gibi. Ben belirtildiği gibi sys.stdin.readline() yeniden yönlendirmeyi destekler ve yukarıdaki komut dosyasını readline() kullanarak yeniden yazmanız gerekir.

Geri orijinal konuya yapmanız gereken tüm raw_input() kullanmamayı Cmd söylemektir:

Cmd.use_rawinput = 0 

veya

pdb = pdb.Pdb() 
pdb.use_rawinput=0 
pdb.set_trace() 
2

Eğer pdb'yi kodda çağırıyorsanız, kendi stdout'unuzu yapıcınıza iletebilirsiniz. sys.__stdout__ iyi bir seçim olabilir.

Komut satırından pdb'yi çağırıyorsanız, pdb.py'den main() işlevini kendi sane_pdb.py dosyanıza kopyalayabilirsiniz.

pdb = Pdb(stdout=sys.__stdout__) 

Sonra pdb.py. yerine sane_pdb.py çağırmak: Ardından için Pdb() başlatma değiştirmek Sadece birini değiştirmek için 40 satırı kendi dosyanıza kopyalamanız harika bir şey değil, ama bu bir seçenek.

# sane_pdb.py: launch Pdb with stdout on original 
import sys, pdb 
def fixed_pdb(Pdb=pdb.Pdb): 
    '''make Pdb() tied to original stdout''' 
    return Pdb(stdout=sys.__stdout__) 

if __name__ == '__main__': 
    pdb.Pdb = fixed_pdb 
    pdb.main() 

ı don: sadece bunlardan birini değiştirmek için

4

Bu cevap sadece 40 satır kopyalayarak gerektirmeyen bir şekilde pdb.py main() fonksiyonunu sarılması bir yolu olarak, Ned'in ek edilir ... aslında sorunu olanın problemi için çalışıyorsa 't biliyorum, ama Ned tarif yapar

İlgili konular