]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/wx/py/interpreter.py
1 """Interpreter executes Python commands."""
3 __author__
= "Patrick K. O'Brien <pobrien@orbtech.com>"
5 __revision__
= "$Revision$"[11:-2]
9 from code
import InteractiveInterpreter
14 class Interpreter(InteractiveInterpreter
):
15 """Interpreter based on code.InteractiveInterpreter."""
17 revision
= __revision__
19 def __init__(self
, locals=None, rawin
=None,
20 stdin
=sys
.stdin
, stdout
=sys
.stdout
, stderr
=sys
.stderr
):
21 """Create an interactive interpreter object."""
22 InteractiveInterpreter
.__init
__(self
, locals=locals)
28 __builtin__
.raw_input = rawin
30 copyright
= 'Type "help", "copyright", "credits" or "license"'
31 copyright
+= ' for more information.'
32 self
.introText
= 'Python %s on %s%s%s' % \
33 (sys
.version
, sys
.platform
, os
.linesep
, copyright
)
36 except AttributeError:
40 except AttributeError:
43 # List of lists to support recursive push().
44 self
.commandBuffer
= []
45 self
.startupScript
= None
48 def push(self
, command
):
49 """Send command to the interpreter to be executed.
51 Because this may be called recursively, we append a new list
52 onto the commandBuffer list and then append commands into
53 that. If the passed in command is part of a multi-line
54 command we keep appending the pieces to the last list in
55 commandBuffer until we have a complete command. If not, we
56 delete that last list."""
58 # In case the command is unicode try encoding it
59 if type(command
) == unicode:
61 command
= command
.encode(wx
.GetDefaultPyEncoding())
62 except UnicodeEncodeError:
63 pass # otherwise leave it alone
66 try: del self
.commandBuffer
[-1]
67 except IndexError: pass
68 if not self
.more
: self
.commandBuffer
.append([])
69 self
.commandBuffer
[-1].append(command
)
70 source
= '\n'.join(self
.commandBuffer
[-1])
71 more
= self
.more
= self
.runsource(source
)
72 dispatcher
.send(signal
='Interpreter.push', sender
=self
,
73 command
=command
, more
=more
, source
=source
)
76 def runsource(self
, source
):
77 """Compile and run source code in the interpreter."""
78 stdin
, stdout
, stderr
= sys
.stdin
, sys
.stdout
, sys
.stderr
79 sys
.stdin
, sys
.stdout
, sys
.stderr
= \
80 self
.stdin
, self
.stdout
, self
.stderr
81 more
= InteractiveInterpreter
.runsource(self
, source
)
82 # If sys.std* is still what we set it to, then restore it.
83 # But, if the executed source changed sys.std*, assume it was
84 # meant to be changed and leave it. Power to the people.
85 if sys
.stdin
== self
.stdin
:
87 if sys
.stdout
== self
.stdout
:
89 if sys
.stderr
== self
.stderr
:
93 def getAutoCompleteKeys(self
):
94 """Return list of auto-completion keycodes."""
97 def getAutoCompleteList(self
, command
='', *args
, **kwds
):
98 """Return list of auto-completion options for a command.
100 The list of options will be based on the locals namespace."""
101 stdin
, stdout
, stderr
= sys
.stdin
, sys
.stdout
, sys
.stderr
102 sys
.stdin
, sys
.stdout
, sys
.stderr
= \
103 self
.stdin
, self
.stdout
, self
.stderr
104 l
= introspect
.getAutoCompleteList(command
, self
.locals,
106 sys
.stdin
, sys
.stdout
, sys
.stderr
= stdin
, stdout
, stderr
109 def getCallTip(self
, command
='', *args
, **kwds
):
110 """Return call tip text for a command.
112 Call tip information will be based on the locals namespace."""
113 return introspect
.getCallTip(command
, self
.locals, *args
, **kwds
)
116 class InterpreterAlaCarte(Interpreter
):
117 """Demo Interpreter."""
119 def __init__(self
, locals, rawin
, stdin
, stdout
, stderr
,
120 ps1
='main prompt', ps2
='continuation prompt'):
121 """Create an interactive interpreter object."""
122 Interpreter
.__init
__(self
, locals=locals, rawin
=rawin
,
123 stdin
=stdin
, stdout
=stdout
, stderr
=stderr
)