[Python-ideas] Running Python commands from a Shell (was: Option of running shell/console commands inside the REPL)

Chris Angelico rosuav at gmail.com
Fri Feb 1 15:51:11 EST 2019


On Sat, Feb 2, 2019 at 7:39 AM Dan Sommers
<2QdxY4RzWzUUiLuE at potatochowder.com> wrote:
>
> On 2/1/19 2:26 AM, João Matos wrote:
> > Hello,
> >
> >
> > Consider adding the option of running shell/console commands inside the REPL.
> > Something like
> >>>>!dir

(This might be better on python-list rather than here)

> I first ran into this in the days of teletypes and dumb
> terminals, where other programs let you run shell commands
> from inside them.  Now the shoe appears to be on the other
> foot.
>
> So why not turn that around?  ksh (since way back when) and
> bash (since 2008, according to what I read somewhere online)
> have "co-processes," which allow you to run a command "in
> the background," and send commands and receive replies from
> it.  So I tried it with Python, but it didn't work:
>
>      $ coproc P3 { python3; }
>      $ echo 'import sys; print(sys.version)' >&${P3[1]}
>      $ read v <&${P3[0]}
>      [the read command just waits forever]

Looks like you may have a problem with output buffering. Try running
"python3 -u" to tell it to run stdout/stderr unbuffered - otherwise,
Python assumes that its output is going to a file and it won't matter.
Alternatively, explicitly flush stdout after output, which could be
done with a display hook:

_old_hook = sys.displayhook
def display(obj):
    _old_hook(obj)
    sys.stdout.flush()
sys.displayhook = display

But unless you're expecting a lot of output, it's probably easier and
just as effective to simply use "-u".

ChrisA


More information about the Python-ideas mailing list