trouble with cmd.Cmd and prompting

Peter Otten __peter__ at web.de
Tue Jan 3 10:57:26 EST 2017


Cameron Simpson wrote:

> On 03Jan2017 00:14, Dennis Lee Bieber <wlfraed at ix.netcom.com> wrote:
>>On Tue, 3 Jan 2017 11:33:15 +1100, Cameron Simpson <cs at zip.com.au>
>>declaimed the following:
>>>I'm using cmd.Cmd to write a little FTP-like command line to interface to
>>>a storage system of mine and encountering weird behaviour. When I enter a
>>>command the next prompt appears _before_ the associated operation runs,
>>>or so it appears.
>><SNIP>
>>>Has anyone seen this kind of thing before?
>>
>>Haven't used the module but there is something I find intriguing in the
>>help system
>>-=-=-=-=-
>> Cmd.precmd(line)
>>    Hook method executed just before the command line is interpreted, but
>>after the input prompt is generated and issued.
>>-=-=-=-=-
>>"... AFTER the input prompt is ... issued"
>>
>>I don't know, but that sure sounds to me like the cmd object tends to
>>process one line behind... Though that behavior is not shown in the turtle
>>example in the help system.
> 
> Hmm. Interesting. I had read that text to imply (based on what I imagined
> _should_ happen) that the flow of control went:
> 
>   cmdloop:
>     issue prompt>
>     line=input()  # or readline
>     line=precmd(line)
>     stop=onecmd(line) # which calls do_blah...
>     stop=postcmd(stop,line)
>     if stop:
>       break
> 
> but your reading of it suggests that this is possible:
> 
>   issue prompt>
>   cmdloop:
>     line=input()  # or readline
>     issue prompt>
>     line=precmd(line)
>     stop=onecmd(line) # which calls do_blah...
>     stop=postcmd(stop,line)
>     if stop:
>       break
> 
> The text for Cmd.cmdloop starts with this:
> 
>   Repeatedly issue a prompt, accept input, parse an initial prefix off the
>   received input, and dispatch to action methods, passing them the
>   remainder of the line as argument.
> 
> which argues for the former, and was what I naively expected.
> 
> I guess I'd better dig out the source; I dislike going that far, not
> merely out of laziness, but also because the source is not the spec.
> 
> Thanks for the suggestion,
> Cameron Simpson <cs at zip.com.au>

I don't believe Dennis' reading of the docs is correct, and the relevant 
part of the source (Python 3.4) does not show anything to support it:

            while not stop:
                if self.cmdqueue:
                    line = self.cmdqueue.pop(0)
                else:
                    if self.use_rawinput:
                        try:
                            line = input(self.prompt)
                        except EOFError:
                            line = 'EOF'
                    else:
                        self.stdout.write(self.prompt)
                        self.stdout.flush()
                        line = self.stdin.readline()
                        if not len(line):
                            line = 'EOF'
                        else:
                            line = line.rstrip('\r\n')
                line = self.precmd(line)
                stop = self.onecmd(line)
                stop = self.postcmd(stop, line)
            self.postloop()

Is there something asynchronous in your command? Perhaps you can post a 
minimal runnable example that shows the odd behaviour.



More information about the Python-list mailing list