Forcing prompt to be on newline when embedding Python with stdin/out redirection

eryk sun eryksun at gmail.com
Thu Jan 5 22:54:42 EST 2017


On Fri, Jan 6, 2017 at 1:06 AM, H Krishnan <hetchkay at gmail.com> wrote:
> I tried replacing sys.displayhook with a function that does not print
> newline but the newline still got inserted. So, I am not sure where the
> newline is coming from. In any case, I could override sys.displayhook to add
> a newline at the end and that seems to resolve my problem.

In Python 2 the newline is written depending on the value of
sys.stdout.softspace. sys.displayhook initially calls Py_FlushLine,
which resets the file's softspace to 0 via PyFile_SoftSpace and writes
a newline if the previous value was non-zero. Next displayhook writes
the repr, sets the softspace to 1 and calls Py_FlushLine again.

The result you're seeing could occur if your filelike object doesn't
have a dict or a property to allow setting the "softspace" attribute,
as the following toy example demonstrates:

    import sys

    class File(object):
        def __init__(self, file):
            self._file = file
            self._sp_enabled = True
            self.softspace = 0

        def write(self, string):
            return self._file.write(string)

        def __getattribute__(self, name):
            value = object.__getattribute__(self, name)
            if name == 'softspace':
                if not self._sp_enabled:
                    raise AttributeError
                self._file.write('[get softspace <- %d]\n' % value)
            return value

        def __setattr__(self, name, value):
            if name == 'softspace':
                if not self._sp_enabled:
                    raise AttributeError
                self._file.write('[set softspace -> %d]\n' % value)
            object.__setattr__(self, name, value)

softspace enabled:

    >>> sys.stdout = File(sys.stdout)
    [set softspace -> 0]
    [get softspace <- 0]
    [set softspace -> 0]
    >>> 42
    [get softspace <- 0]
    [set softspace -> 0]
    42[get softspace <- 0]
    [set softspace -> 1]
    [get softspace <- 1]
    [set softspace -> 0]

    [get softspace <- 0]
    [set softspace -> 0]

softspace disabled:

    >>> sys.stdout._sp_enabled = False
    >>> 42
    42>>> 42
    42>>>



More information about the Python-list mailing list