This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: pdb.Pdb constructor stdout override required to disable use_rawinput
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 3.8, Python 3.7, Python 3.6, Python 3.4, Python 3.5, Python 2.7
process
Status: closed Resolution: duplicate
Dependencies: Superseder: can cmd.py's API/docs for the use of an alternate stdin be improved?
View: 2571
Assigned To: Nosy List: m01, r.david.murray
Priority: normal Keywords:

Created on 2018-06-03 12:03 by m01, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (3)
msg318536 - (view) Author: Michiel (m01) * Date: 2018-06-03 12:03
It looks like there's possibly a typo/small bug in the pdb.Pdb code. If I supply the stdin argument to the constructor, and provide e.g. a io.StringIO object, then I expect commands to be read from there. This however doesn't happen. If I additionally supply a stdout argument, then it works.

This is because use_rawinput is only disabled if stdout is specified, see https://github.com/python/cpython/blob/3.7/Lib/pdb.py#L144:

...
    def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
                 nosigint=False, readrc=True):
        bdb.Bdb.__init__(self, skip=skip)
        cmd.Cmd.__init__(self, completekey, stdin, stdout)
        if stdout:
            self.use_rawinput = 0
...

I think it should be disabled if stdin is supplied, or possibly if either is specified (I'm not sure).

Repro:

import pdb
import io
pdb_script = io.StringIO("p 'hello';; c")
output = io.StringIO()

Buggy behaviour:

In [5]: pdb.Pdb(stdin=pdb_script).set_trace()
--Call--
> /usr/lib/python3.6/site-packages/IPython/core/displayhook.py(247)__call__()
-> def __call__(self, result=None):
(Pdb) c

Expected behaviour:

(Pdb) 'hello'

Working if stdout is supplied:

In [6]: pdb_script.seek(0)
Out[6]: 0

In [7]: pdb.Pdb(stdin=pdb_script, stdout=output).set_trace()

In [8]: print(output.getvalue())
--Call--
> /usr/lib/python3.6/site-packages/IPython/core/displayhook.py(247)__call__()
-> def __call__(self, result=None):
(Pdb) 'hello'


I would've had a go at fixing this, but even after reading the docs at https://docs.python.org/3/library/cmd.html#cmd.Cmd.use_rawinput it's not entirely obvious to me which combinations of stdin/stdout overrides should be valid and when use_rawinput should be set to 0. However, I'm pretty sure it should at least be set to 0 if stdin is supplied, which currently isn't the case.
msg318559 - (view) Author: Michiel (m01) * Date: 2018-06-03 15:37
Based on code inspection, this affects 2.7 - current master
msg318587 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2018-06-03 22:45
This is a duplicate of 2571 and 10396.  As I commented in 10396, if you want to work on an enhancement request (for cmd) that improves the situation, it will be welcome; but as you observed what to do isn't immediately obvious, so discussion before implementation is probably a good idea.  I'm going to close this, but feel free to open an enhancement issue with a proposal.
History
Date User Action Args
2022-04-11 14:59:01adminsetgithub: 77930
2018-06-03 22:45:42r.david.murraysetsuperseder: can cmd.py's API/docs for the use of an alternate stdin be improved?
2018-06-03 22:45:19r.david.murraysetstatus: open -> closed

nosy: + r.david.murray
messages: + msg318587

resolution: duplicate
stage: resolved
2018-06-03 15:37:39m01setmessages: + msg318559
versions: + Python 2.7, Python 3.4, Python 3.5, Python 3.7, Python 3.8
2018-06-03 12:03:45m01create