How to tell if I'm being run from a shell or a module

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Thu Feb 14 17:06:43 EST 2008


En Thu, 14 Feb 2008 19:09:10 -0200, <dg.google.groups at thesamovar.net>  
escribió:

> Thanks for the replies, but it's not what I meant. What I want to be
> able to determine is whether or not the user is running from an
> interactive shell (like IPython or IDLE). Checking if
> __name__=='__main__' checks if the current module is the one being
> run, but suppose you have two modules A and B, with the function f
> defined in module B that should print 'Interactive' or 'Module' say.
> The module A just consists of: import B; B.f(). Now whenever f is
> called, __name__ will not be '__main__' for it. Someone using IDLE
> could write import B then B.f() too. The question is: is there a way
> for f to determine if someone was using an interactive shell to call
> it or if it was being called some other way. The way I came up with
> works in these limited cases but won't work in a more general
> situation (but perhaps there is no way for it to know in the more
> general situation).

It depends on what you mean by "an interactive shell"? If you start your  
script with:
python -i whatever.py
is it an interactive shell or not?

I tried these two criteria:
a) See if the __main__ module has a __file__ attribute.
b) See if sys.stdin is a real tty

These are the results I got on Windows for several configurations:

<test.py>
import sys
print "__main__ has __file__", hasattr(sys.modules['__main__'], '__file__')
import os
print "sys.stdin is a tty", hasattr(sys.stdin, "fileno") and  
os.isatty(sys.stdin.fileno())
</test.py>

python test.py
__main__ has __file__ True
sys.stdin is a tty True

python -i test.py
__main__ has __file__ True
sys.stdin is a tty True

python test.py <nul >nul
__main__ has __file__ True
sys.stdin is a tty True

python test.py <emptyfile >nul
__main__ has __file__ True
sys.stdin is a tty False

pythonw.exe (the consoleless Python executable for Windows)
__main__ has __file__ True
sys.stdin is a tty False

IDLE
__main__ has __file__ False
sys.stdin is a tty False

pythonwin.exe
__main__ has __file__ False
sys.stdin is a tty False


-- 
Gabriel Genellina




More information about the Python-list mailing list