includes several new tools. As part of the change the location of the pacakge has changed as well, it is now accessible as "from wxPython import py" (or "from wx import py" using the new namespace.) There are still some transition moudules in the wxPython.lib.PyCrust mackage that will issue a warning and then import what is needed from the new package. These will be removed in a future release. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@20104 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
126 lines
4.6 KiB
Python
126 lines
4.6 KiB
Python
"""PyCrust Interpreter executes Python commands."""
|
|
|
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
|
__cvsid__ = "$Id$"
|
|
__revision__ = "$Revision$"[11:-2]
|
|
|
|
import os
|
|
import sys
|
|
from code import InteractiveInterpreter
|
|
import dispatcher
|
|
import introspect
|
|
|
|
try:
|
|
True
|
|
except NameError:
|
|
True = 1==1
|
|
False = 1==0
|
|
|
|
|
|
class Interpreter(InteractiveInterpreter):
|
|
"""PyCrust Interpreter based on code.InteractiveInterpreter."""
|
|
|
|
revision = __revision__
|
|
|
|
def __init__(self, locals=None, rawin=None,
|
|
stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr):
|
|
"""Create an interactive interpreter object."""
|
|
InteractiveInterpreter.__init__(self, locals=locals)
|
|
self.stdin = stdin
|
|
self.stdout = stdout
|
|
self.stderr = stderr
|
|
if rawin:
|
|
import __builtin__
|
|
__builtin__.raw_input = rawin
|
|
del __builtin__
|
|
copyright = 'Type "help", "copyright", "credits" or "license"'
|
|
copyright += ' for more information.'
|
|
self.introText = 'Python %s on %s%s%s' % \
|
|
(sys.version, sys.platform, os.linesep, copyright)
|
|
try:
|
|
sys.ps1
|
|
except AttributeError:
|
|
sys.ps1 = '>>> '
|
|
try:
|
|
sys.ps2
|
|
except AttributeError:
|
|
sys.ps2 = '... '
|
|
self.more = 0
|
|
# List of lists to support recursive push().
|
|
self.commandBuffer = []
|
|
self.startupScript = os.environ.get('PYTHONSTARTUP')
|
|
|
|
def push(self, command):
|
|
"""Send command to the interpreter to be executed.
|
|
|
|
Because this may be called recursively, we append a new list
|
|
onto the commandBuffer list and then append commands into
|
|
that. If the passed in command is part of a multi-line
|
|
command we keep appending the pieces to the last list in
|
|
commandBuffer until we have a complete command. If not, we
|
|
delete that last list."""
|
|
command = str(command) # In case the command is unicode.
|
|
if not self.more:
|
|
try: del self.commandBuffer[-1]
|
|
except IndexError: pass
|
|
if not self.more: self.commandBuffer.append([])
|
|
self.commandBuffer[-1].append(command)
|
|
source = '\n'.join(self.commandBuffer[-1])
|
|
more = self.more = self.runsource(source)
|
|
dispatcher.send(signal='Interpreter.push', sender=self,
|
|
command=command, more=more, source=source)
|
|
return more
|
|
|
|
def runsource(self, source):
|
|
"""Compile and run source code in the interpreter."""
|
|
stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
|
|
sys.stdin, sys.stdout, sys.stderr = \
|
|
self.stdin, self.stdout, self.stderr
|
|
more = InteractiveInterpreter.runsource(self, source)
|
|
# If sys.std* is still what we set it to, then restore it.
|
|
# But, if the executed source changed sys.std*, assume it was
|
|
# meant to be changed and leave it. Power to the people.
|
|
if sys.stdin == self.stdin:
|
|
sys.stdin = stdin
|
|
if sys.stdout == self.stdout:
|
|
sys.stdout = stdout
|
|
if sys.stderr == self.stderr:
|
|
sys.stderr = stderr
|
|
return more
|
|
|
|
def getAutoCompleteKeys(self):
|
|
"""Return list of auto-completion keycodes."""
|
|
return [ord('.')]
|
|
|
|
def getAutoCompleteList(self, command='', *args, **kwds):
|
|
"""Return list of auto-completion options for a command.
|
|
|
|
The list of options will be based on the locals namespace."""
|
|
stdin, stdout, stderr = sys.stdin, sys.stdout, sys.stderr
|
|
sys.stdin, sys.stdout, sys.stderr = \
|
|
self.stdin, self.stdout, self.stderr
|
|
l = introspect.getAutoCompleteList(command, self.locals,
|
|
*args, **kwds)
|
|
sys.stdin, sys.stdout, sys.stderr = stdin, stdout, stderr
|
|
return l
|
|
|
|
def getCallTip(self, command='', *args, **kwds):
|
|
"""Return call tip text for a command.
|
|
|
|
Call tip information will be based on the locals namespace."""
|
|
return introspect.getCallTip(command, self.locals, *args, **kwds)
|
|
|
|
|
|
class InterpreterAlaCarte(Interpreter):
|
|
"""PyCrustAlaCarte Demo Interpreter."""
|
|
|
|
def __init__(self, locals, rawin, stdin, stdout, stderr,
|
|
ps1='main prompt', ps2='continuation prompt'):
|
|
"""Create an interactive interpreter object."""
|
|
Interpreter.__init__(self, locals=locals, rawin=rawin,
|
|
stdin=stdin, stdout=stdout, stderr=stderr)
|
|
sys.ps1 = ps1
|
|
sys.ps2 = ps2
|
|
|
|
|