diff --git a/bpython/curtsiesfrontend/coderunner.py b/bpython/curtsiesfrontend/coderunner.py index 6087edb08..d53e75d48 100644 --- a/bpython/curtsiesfrontend/coderunner.py +++ b/bpython/curtsiesfrontend/coderunner.py @@ -205,7 +205,7 @@ def request_from_main_context(self, force_refresh=False): class FakeOutput(object): - def __init__(self, coderunner, on_write, fileno=1): + def __init__(self, coderunner, on_write, real_fileobj): """Fakes sys.stdout or sys.stderr on_write should always take unicode @@ -215,7 +215,7 @@ def __init__(self, coderunner, on_write, fileno=1): """ self.coderunner = coderunner self.on_write = on_write - self.real_fileno = fileno + self._real_fileobj = real_fileobj def write(self, s, *args, **kwargs): if not py3 and isinstance(s, str): @@ -227,7 +227,7 @@ def write(self, s, *args, **kwargs): # have a method called fileno. One example is pwntools. This # is not a widespread issue, but is annoying. def fileno(self): - return self.real_fileno + return self._real_fileobj.fileno() def writelines(self, l): for s in l: @@ -238,3 +238,7 @@ def flush(self): def isatty(self): return True + + @property + def encoding(self): + return self._real_fileobj.encoding diff --git a/bpython/curtsiesfrontend/repl.py b/bpython/curtsiesfrontend/repl.py index 9bccca5fe..de31dc686 100644 --- a/bpython/curtsiesfrontend/repl.py +++ b/bpython/curtsiesfrontend/repl.py @@ -220,7 +220,7 @@ def close(self): @property def encoding(self): - return "UTF8" + return sys.__stdin__.encoding # TODO write a read() method? @@ -421,12 +421,12 @@ def __init__( self.stdout = FakeOutput( self.coderunner, self.send_to_stdouterr, - fileno=sys.__stdout__.fileno(), + real_fileobj=sys.__stdout__, ) self.stderr = FakeOutput( self.coderunner, self.send_to_stdouterr, - fileno=sys.__stderr__.fileno(), + real_fileobj=sys.__stderr__, ) self.stdin = FakeStdin(self.coderunner, self, self.edit_keys) diff --git a/bpython/test/test_curtsies_coderunner.py b/bpython/test/test_curtsies_coderunner.py index 25844af59..94d8106d6 100644 --- a/bpython/test/test_curtsies_coderunner.py +++ b/bpython/test/test_curtsies_coderunner.py @@ -20,8 +20,8 @@ def test_simple(self): request_refresh=lambda: self.orig_stdout.flush() or self.orig_stderr.flush() ) - stdout = FakeOutput(c, lambda *args, **kwargs: None) - stderr = FakeOutput(c, lambda *args, **kwargs: None) + stdout = FakeOutput(c, lambda *args, **kwargs: None, None) + stderr = FakeOutput(c, lambda *args, **kwargs: None, None) sys.stdout = stdout sys.stdout = stderr c.load_code("1 + 1") @@ -38,8 +38,8 @@ def test_exception(self): def ctrlc(): raise KeyboardInterrupt() - stdout = FakeOutput(c, lambda x: ctrlc()) - stderr = FakeOutput(c, lambda *args, **kwargs: None) + stdout = FakeOutput(c, lambda x: ctrlc(), None) + stderr = FakeOutput(c, lambda *args, **kwargs: None, None) sys.stdout = stdout sys.stderr = stderr c.load_code("1 + 1") @@ -51,5 +51,5 @@ def assert_unicode(self, s): self.assertIsInstance(s, type(u"")) def test_bytes(self): - out = FakeOutput(mock.Mock(), self.assert_unicode) + out = FakeOutput(mock.Mock(), self.assert_unicode, None) out.write("native string type")