2010-02-19 25 views
6

Yapmaya çalıştığım şey, bazı terminal komutlarının çıktısını bir wx.TextCtrl widget'ına yazdırmaktır. Bunu başarmanın en kolay yolunun özel bir stdout sınıfı oluşturması ve yazım işlevini widget'ınkiyle aşırı yüklemesi olduğunu düşündüm.Özel bir sys.stdout sınıfı oluşturma?

stdout'u sınıfı:

class StdOut(sys.stdout): 
    def __init__(self,txtctrl): 
     sys.stdout.__init__(self) 
     self.txtctrl = txtctrl 

    def write(self,string): 
     self.txtctrl.write(string) 

Sonra bir şey yapacağını örneğin:

sys.stdout = StdOut(createdTxtCtrl)  
subprocess.Popen('echo "Hello World!"',stdout=sys.stdout,shell=True) 

Ne sonuçları aşağıdaki hatadır:

Traceback (most recent call last): 
File "mainwindow.py", line 12, in <module> 
from systemconsole import SystemConsole 
File "systemconsole.py", line 4, in <module> 
class StdOut(sys.stdout): 
TypeError: Error when calling the metaclass bases 
file() argument 2 must be string, not tuple 

herhangi bir fikir bu olur düzeltmek için Takdir edilmek

cevap

11

sys.stdout olan olmayan bir class, (tip file arasında) bir örneği var.

Yani, sadece yapın:

class StdOut(object): 
    def __init__(self,txtctrl): 
     self.txtctrl = txtctrl 
    def write(self,string): 
     self.txtctrl.write(string) 

sys.stdout = StdOut(the_text_ctrl) 

file devralan gerek yok, sadece bu gibi basit bir dosya benzeri bir nesne yapmak! yazarak Ördek ... senin arkadaşın

(çoğu diğer OO diller gibi ama farklı şekilde Javascript, sadece şimdiye kadar AKA sınıflar türlerinden devralır, Python unutmayın

, aslagelen örnekler sınıfları/türlerinden ;-).

+3

Bunu denedim ve sonuçlandı: traceback (son En son çağrı): ' "! Merhaba Dünya" echo' OnNew subprocess.Popen (içinde Dosya "blade_gui.py", hat 179, stdout'u = sys.stdout, shell = Doğru) Dosya "C: \ Python26 \ lib \ subprocess.py", satır 614, in __init__ errread, errwrite) = self._get_handles (stdin, stdout, stderr) Dosya "C: \ Python26 \ lib \ subprocess.py ", satır 734, _get_handles içinde c2pwrite = msvcrt.get_osfhandle (stdout.fileno()) AttributeError: 'StdOut' nesnesinin 'fileno' özniteliği yok – Duck

+2

' alt işlem ', herhangi bir dil (sadece Python değil!) ve "gerçek işletim sistemi düzeyinde bir dosyaya" ihtiyaç duyar. ., bir FD ile, aynı zamanda fileno olarak da bilinir) - gerçek bir OS seviyesinde dosya (neyse ki, alt süreç dahil) dışında altprocess.Popen 'stdout = 'gibi bir şey iletmenin hiçbir yolu yoktur.PIPE, ebeveyn işleminizin çocuk sürecinin çıktısını almasına izin verir - ancak, çocuk işleminde arabelleğe alma genellikle istediğinizi değil, bu yüzden her zaman “pexpect” veya “wexpect” kullanmayı öneririm. –

+2

sadece yazmadan daha fazlasına ihtiyacınız var, aynı zamanda “ne zaman kullanılır”, belki de başkalarının nasıl kullanılacağına bağlı olarak. – SimplyKnownAsG

-1

sys.stdout = StdOut(createdTxtCtrl) çevrimsel bağımlılık yaratmaz mı? sys.stdout'u sys.stdout'dan türetilen sınıfa yeniden tayin etmeyin.

0

Uygulamanız gereken tek şey yazıyorsa, yeni bir sınıf tanımlamanıza gerek yoktur. Birincisi, StdOut(createdTxtCtrl) yerine createdTxtCtrl kullanın, çünkü zaten ihtiyacınız olan işlemi destekliyor.

Eğer Stdout'a ile tüm yapmanız gereken doğrudan bazı programların çıkışı yoksa, sadece kendi dosya benzeri bir nesne (createdTxtCtrl) ile subprocess.Popen örneğini, sys.stdout değişmez, orada hepsi bir sürü yönlendirmek yerine değil sys.stdout.