How do I tell if I'm running in the PyWin interpreter?

C

Charles Krug

Here's the deal:

I've a dead-simple command-line program I'm using to test things that I
can't (for various reasons) test in the IDE.

Here's a do-nothing subset that shows the idea:

# insanely simply command interpreter
import Commands
import sys

myPrompt = '$> '

# Raw Input doesn't QUITE do what I want in Python Win.
while True:
try:
args = raw_input(myPrompt).strip().split()
except EOFError:
break

cmd = args[0]
print '>%s<' % cmd
print args

As the comment says, when I run this under Python Win, I get an (pretty
sure) Tkinter interface, not a command line, and I don't get my
EOFError when I expect to.

This is something I occasionally need in my Swiss Army Knife. Not
often, but when I need something like this, I need something like THIS
pretty badly, and sometimes I need to run it under PyWin (and under
Linux, Unix, Solaris, and anything else you might name and a few things
I bet you couldn't).

Is there a way to detect that I'm running the the PyWin interpreter so
that I can bypass its raw_input behavior?

Is there a simpler way to do this?

I recall some sample code that did something very much like this (define
a small set of callbacks and execute them from a command-like interface)
but I can't seem to lay my hands on the example.

Thanx


Charles
 
S

Steven D'Aprano

Here's the deal:

I've a dead-simple command-line program I'm using to test things that I
can't (for various reasons) test in the IDE.

Here's a do-nothing subset that shows the idea:

# insanely simply command interpreter
import Commands
import sys

myPrompt = '$> '

# Raw Input doesn't QUITE do what I want in Python Win.
while True:
try:
args = raw_input(myPrompt).strip().split()
except EOFError:
break

cmd = args[0]
print '>%s<' % cmd
print args

As the comment says, when I run this under Python Win, I get an (pretty
sure) Tkinter interface, not a command line, and I don't get my
EOFError when I expect to.

When do you expect to get an EOFError? The only way I get an EOFError is
if I explicitly hit Ctrl-D while raw_input is running. When do you expect
to get it? Have you tried Ctrl-Z under Windows?
 
C

Charles Krug

When do you expect to get an EOFError? The only way I get an EOFError is
if I explicitly hit Ctrl-D while raw_input is running. When do you expect
to get it? Have you tried Ctrl-Z under Windows?

That's exactly how I use it everywhere else. Type until you're done
then hit <Ctrl-D>

The problem is only when running under the PyWin IDE . . I'd been using
this for months under Idle and every place else I needed it.

The problem is that PyWin doesn't give you a raw command line with in
response to raw_input, but gives you a text entry box and a nice
OK-Cancel yada yada interface that silently eats my EOF.

I'd like to have a single tool I can use everywhere. So far as I can
tell, that means I have to detect the PyWin IDE and handle it
separately on initialization so I get a real raw input and not the
redefined Tkinter version.
 
P

Peter Otten

Charles said:
Is there a way to detect that I'm running the the PyWin interpreter so
that I can bypass its raw_input behavior?

You could test

if pywin_specific_module in sys.modules:
# use workaraound

Or maybe you can get away with always using sys.stdin.readline() instead of
raw_input()? Look into cmd.py for an example.

Peter
 
V

vincent wehren

| >>
| >> As the comment says, when I run this under Python Win, I get an (pretty
| >> sure) Tkinter interface, not a command line, and I don't get my
| >> EOFError when I expect to.
| >
| > When do you expect to get an EOFError? The only way I get an EOFError is
| > if I explicitly hit Ctrl-D while raw_input is running. When do you
expect
| > to get it? Have you tried Ctrl-Z under Windows?
| >
|
| That's exactly how I use it everywhere else. Type until you're done
| then hit <Ctrl-D>
|
| The problem is only when running under the PyWin IDE . . I'd been using
| this for months under Idle and every place else I needed it.
|
| The problem is that PyWin doesn't give you a raw command line with in
| response to raw_input, but gives you a text entry box and a nice
| OK-Cancel yada yada interface that silently eats my EOF.
|
| I'd like to have a single tool I can use everywhere. So far as I can
| tell, that means I have to detect the PyWin IDE and handle it
| separately on initialization so I get a real raw input and not the
| redefined Tkinter version.
|

import sys
import os
if os.path.basename(sys.executable) == 'Pythonwin.exe':
#Pythonwin specific initialization
else:
#Other

HTH,

Vincent Wehren
 
C

Charles Krug

You could test

if pywin_specific_module in sys.modules:
# use workaraound

Or maybe you can get away with always using sys.stdin.readline() instead of
raw_input()? Look into cmd.py for an example.

Peter

cmd.py is the "battery included" I was thinking of last night.
Unfortunately it uses something that PyWin replaces.

However I did note that PyWin's version raises KeyboardInterrupt out of
its dialog box.

That's not ideal, but at least it gives me an idea what I need to trap
to exit.
 
C

Charles Krug

cmd.py is the "battery included" I was thinking of last night.
Unfortunately it uses something that PyWin replaces.

However I did note that PyWin's version raises KeyboardInterrupt out of
its dialog box.

That's not ideal, but at least it gives me an idea what I need to trap
to exit.

Okay, I poked around a bit more and found the initialization code that
does this:

sys.modules['__builtin__'].raw_input=Win32RawInput

Which is the substituted function.

Is there a way to access the original function that I want to use, or do
I need to come up with some other way to do console input?

Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,521
Members
44,995
Latest member
PinupduzSap

Latest Threads

Top