То, что я пытаюсь сделать, просто имеют вывод некоторых терминальных команд, распечатывают к 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
Любые идеи зафиксировать это ценились бы.
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 типов, никогда от экземпляров классов/типов;-))
Если вам нужно реализовать только запись, то нет необходимости определять новый класс. Просто используйте createdTxtCtrl
вместо StdOut(createdTxtCtrl)
, потому что первый уже поддерживает нужную вам операцию.
Если все, что вам нужно делать со stdout - это направлять туда вывод некоторых программ, а не направлять туда все подряд, не меняйте sys.stdout
, просто инстанцируйте subprocess.Popen
с вашим собственным файлоподобным объектом (createdTxtCtrl
) вместо sys.stdout
.
Разве sys.stdout = StdOut (createdTxtCtrl)
не создает циклическую зависимость? Старайтесь не переназначать sys.stdout
классу, производному от sys.stdout
.