What I'm trying to do is simply have the output of some terminal commands print out to a wx.TextCtrl widget. I figured the easiest way to accomplish this is to create a custom stdout class and overload the write function to that of the widget.
stdout class:
class StdOut(sys.stdout):
def __init__(self,txtctrl):
sys.stdout.__init__(self)
self.txtctrl = txtctrl
def write(self,string):
self.txtctrl.write(string)
And then I would do something such as:
sys.stdout = StdOut(createdTxtCtrl)
subprocess.Popen('echo "Hello World!"',stdout=sys.stdout,shell=True)
What results is the following error:
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
Any ideas to fix this would be appreciated.
stdout. A built-in file object that is analogous to the interpreter's standard output stream in Python. stdout is used to display output directly to the screen console.
In IDLE, sys. __stdout__ is the program's original standard output - which goes nowhere, since it's not a console application. In other words, IDLE itself has already replaced sys. stdout with something else (its own console window), so you're taking two steps backwards by replacing your own stdout with __stdout__ .
Class StdOut. Overview. The StdOut class provides methods for printing strings and numbers to standard output.
sys.stdout
is not a class
, it's an instance (of type file
).
So, just do:
class StdOut(object):
def __init__(self,txtctrl):
self.txtctrl = txtctrl
def write(self,string):
self.txtctrl.write(string)
sys.stdout = StdOut(the_text_ctrl)
No need to inherit from file
, just make a simple file-like object like this! Duck typing is your friend...
(Note that in Python, like most other OO languages but differently from Javascript, you only ever inherit from classes AKA types, never from instances of classes/types;-).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With