example-embed.py
137 lines
| 4.7 KiB
| text/x-python
|
PythonLexer
fperez
|
r0 | #!/usr/bin/env python | ||
"""An example of how to embed an IPython shell into a running program. | ||||
Please see the documentation in the IPython.Shell module for more details. | ||||
The accompanying file example-embed-short.py has quick code fragments for | ||||
embedding which you can cut and paste in your code once you understand how | ||||
things work. | ||||
The code in this file is deliberately extra-verbose, meant for learning.""" | ||||
# The basics to get you going: | ||||
# IPython sets the __IPYTHON__ variable so you can know if you have nested | ||||
# copies running. | ||||
# Try running this code both at the command line and from inside IPython (with | ||||
# %run example-embed.py) | ||||
MinRK
|
r4124 | from IPython.config.loader import Config | ||
fperez
|
r0 | try: | ||
MinRK
|
r4124 | get_ipython | ||
fperez
|
r0 | except NameError: | ||
nested = 0 | ||||
MinRK
|
r4124 | cfg = Config() | ||
MinRK
|
r5548 | prompt_config = cfg.PromptManager | ||
prompt_config.in_template = 'In <\\#>: ' | ||||
prompt_config.in2_template = ' .\\D.: ' | ||||
prompt_config.out_template = 'Out<\\#>: ' | ||||
fperez
|
r0 | else: | ||
print "Running nested copies of IPython." | ||||
print "The prompts for the nested copy have been modified" | ||||
MinRK
|
r4124 | cfg = Config() | ||
fperez
|
r0 | nested = 1 | ||
# First import the embeddable shell class | ||||
MinRK
|
r4124 | from IPython.frontend.terminal.embed import InteractiveShellEmbed | ||
fperez
|
r0 | |||
# Now create an instance of the embeddable shell. The first argument is a | ||||
# string with options exactly as you would type them if you were starting | ||||
# IPython at the system command line. Any parameters you want to define for | ||||
# configuration can thus be specified here. | ||||
MinRK
|
r4124 | ipshell = InteractiveShellEmbed(config=cfg, | ||
banner1 = 'Dropping into IPython', | ||||
fperez
|
r0 | exit_msg = 'Leaving Interpreter, back to program.') | ||
# Make a second instance, you can have as many as you want. | ||||
MinRK
|
r4124 | cfg2 = cfg.copy() | ||
MinRK
|
r5548 | prompt_config = cfg2.PromptManager | ||
prompt_config.in_template = 'In2<\\#>: ' | ||||
MinRK
|
r4124 | if not nested: | ||
MinRK
|
r5548 | prompt_config.in_template = 'In2<\\#>: ' | ||
prompt_config.in2_template = ' .\\D.: ' | ||||
prompt_config.out_template = 'Out<\\#>: ' | ||||
MinRK
|
r4124 | ipshell2 = InteractiveShellEmbed(config=cfg, | ||
banner1 = 'Second IPython instance.') | ||||
fperez
|
r0 | |||
print '\nHello. This is printed from the main controller program.\n' | ||||
# You can then call ipshell() anywhere you need it (with an optional | ||||
# message): | ||||
ipshell('***Called from top level. ' | ||||
fperez
|
r749 | 'Hit Ctrl-D to exit interpreter and continue program.\n' | ||
'Note that if you use %kill_embedded, you can fully deactivate\n' | ||||
'This embedded instance so it will never turn on again') | ||||
fperez
|
r0 | |||
print '\nBack in caller program, moving along...\n' | ||||
#--------------------------------------------------------------------------- | ||||
# More details: | ||||
MinRK
|
r4124 | # InteractiveShellEmbed instances don't print the standard system banner and | ||
fperez
|
r0 | # messages. The IPython banner (which actually may contain initialization | ||
MinRK
|
r4124 | # messages) is available as get_ipython().banner in case you want it. | ||
fperez
|
r0 | |||
MinRK
|
r4124 | # InteractiveShellEmbed instances print the following information everytime they | ||
fperez
|
r0 | # start: | ||
# - A global startup banner. | ||||
# - A call-specific header string, which you can use to indicate where in the | ||||
# execution flow the shell is starting. | ||||
# They also print an exit message every time they exit. | ||||
# Both the startup banner and the exit message default to None, and can be set | ||||
# either at the instance constructor or at any other time with the | ||||
MinRK
|
r4124 | # by setting the banner and exit_msg attributes. | ||
fperez
|
r0 | |||
# The shell instance can be also put in 'dummy' mode globally or on a per-call | ||||
# basis. This gives you fine control for debugging without having to change | ||||
# code all over the place. | ||||
# The code below illustrates all this. | ||||
# This is how the global banner and exit_msg can be reset at any point | ||||
MinRK
|
r4124 | ipshell.banner = 'Entering interpreter - New Banner' | ||
ipshell.exit_msg = 'Leaving interpreter - New exit_msg' | ||||
fperez
|
r0 | |||
def foo(m): | ||||
s = 'spam' | ||||
MinRK
|
r4124 | ipshell('***In foo(). Try %whos, or print s or m:') | ||
fperez
|
r0 | print 'foo says m = ',m | ||
def bar(n): | ||||
s = 'eggs' | ||||
MinRK
|
r4124 | ipshell('***In bar(). Try %whos, or print s or n:') | ||
fperez
|
r0 | print 'bar says n = ',n | ||
# Some calls to the above functions which will trigger IPython: | ||||
print 'Main program calling foo("eggs")\n' | ||||
foo('eggs') | ||||
# The shell can be put in 'dummy' mode where calls to it silently return. This | ||||
# allows you, for example, to globally turn off debugging for a program with a | ||||
# single call. | ||||
MinRK
|
r4124 | ipshell.dummy_mode = True | ||
fperez
|
r0 | print '\nTrying to call IPython which is now "dummy":' | ||
ipshell() | ||||
print 'Nothing happened...' | ||||
# The global 'dummy' mode can still be overridden for a single call | ||||
print '\nOverriding dummy mode manually:' | ||||
MinRK
|
r4124 | ipshell(dummy=False) | ||
fperez
|
r0 | |||
# Reactivate the IPython shell | ||||
MinRK
|
r4124 | ipshell.dummy_mode = False | ||
fperez
|
r0 | |||
print 'You can even have multiple embedded instances:' | ||||
ipshell2() | ||||
print '\nMain program calling bar("spam")\n' | ||||
bar('spam') | ||||
print 'Main program finished. Bye!' | ||||
#********************** End of file <example-embed.py> *********************** | ||||