[IPython-dev] IPython 0.9.1 and sys.stdin

Nicolas Rougier Nicolas.Rougier@loria...
Wed Apr 8 01:13:36 CDT 2009



Thanks, I found a work-around by first redirecting stdin and then import
IPython but I did not find where exactly IPython messes with stdin.

Nicolas


On Tue, 2009-04-07 at 16:46 -0700, Fernando Perez wrote:
> On Mon, Apr 6, 2009 at 7:10 AM, Nicolas Rougier
> <Nicolas.Rougier@loria.fr> wrote:
> >
> > Hi,
> >
> > I've question regarding stdin ipython handling. If I try to run
> > interactively the following script:
> >
> > import sys
> > #import IPython
> >
> > class TerminalIn:
> >     def __init__(self):  pass
> >     def close(self):     pass
> >     flush = close
> >     def isatty(self):    return True
> >     def read(self, a):   return self.readline()
> >     def readline(self):  return '"q"'
> >     def readlines(self): return []
> >     def write(self, s):  return None
> >     def writelines(self, l): return None
> >
> > sys.stdin = TerminalIn()
> >
> > and then type 'help()' in the console, depending on the IPython
> > import, I get different results. If I do not include IPython, the help
> > exists immediately (as expected) while if I import IPython, the help
> > does not exit immediately, making me think that IPython is changing
> > something without any kind of warning.
> 
> Mmh, I'm not quite finding right now exactly what it is that may be
> changing.  For one thing, ipython does load help() by itself in
> ipmaker, but this is just the same _Helper object that plain python
> uses:
> 
>     # Put 'help' in the user namespace
>     try:
>         from site import _Helper
>         IP.user_ns['help'] = _Helper()
>     except ImportError:
>         warn('help() not available - check site.py')
> 
> 
> You may also try to manually make changes in genutils.py, where the
> system-wide Term object is created:
> 
> class IOTerm:
>     """ Term holds the file or file-like objects for handling I/O operations.
> 
>     These are normally just sys.stdin, sys.stdout and sys.stderr but for
>     Windows they can can replaced to allow editing the strings before they are
>     displayed."""
> 
>     # In the future, having IPython channel all its I/O operations through
>     # this class will make it easier to embed it into other environments which
>     # are not a normal terminal (such as a GUI-based shell)
>     def __init__(self,cin=None,cout=None,cerr=None):
>         self.cin  = IOStream(cin,sys.stdin)
>         self.cout = IOStream(cout,sys.stdout)
>         self.cerr = IOStream(cerr,sys.stderr)
> 
> # Global variable to be used for all I/O
> Term = IOTerm()
> 
> 
> In principle this is just a wrapper, but it might be causing some side
> effects...
> 
> Just some starting pointers, not a full solution I'm afraid.
> 
> Cheers,
> 
> f



More information about the IPython-dev mailing list