Создание пользовательского sys.stdout класса?

То, что я пытаюсь сделать, просто имеют вывод некоторых терминальных команд, распечатывают к wx. Виджет TextCtrl. Я изобразил самый легкий способ выполнить, это должно создать пользовательский stdout класс и перегрузить функцию записи к тому из виджета.

класс stdout:

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

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

И затем я сделал бы что-то, такое как:

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

Какие результаты следующая ошибка:

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

Любые идеи зафиксировать это ценились бы.

6
задан SilentGhost 19 February 2010 в 16:48
поделиться

3 ответа

sys.stdout - это не класс, это экземпляр (типа file).

Итак, просто сделайте:

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, просто сделайте простой файлоподобный объект, как этот! Duck typing - ваш друг...

(Обратите внимание, что в Python, как и в большинстве других ОО-языков, но иначе, чем в Javascript, вы всегда наследуете только от классов AKA типов, никогда от экземпляров классов/типов;-))

13
ответ дан 9 December 2019 в 20:42
поделиться

Если вам нужно реализовать только запись, то нет необходимости определять новый класс. Просто используйте createdTxtCtrl вместо StdOut(createdTxtCtrl), потому что первый уже поддерживает нужную вам операцию.

Если все, что вам нужно делать со stdout - это направлять туда вывод некоторых программ, а не направлять туда все подряд, не меняйте sys.stdout, просто инстанцируйте subprocess.Popen с вашим собственным файлоподобным объектом (createdTxtCtrl) вместо sys.stdout.

0
ответ дан 9 December 2019 в 20:42
поделиться

Разве sys.stdout = StdOut (createdTxtCtrl) не создает циклическую зависимость? Старайтесь не переназначать sys.stdout классу, производному от sys.stdout .

-1
ответ дан 9 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: