2010-04-09 7 views
15

Je voudrais faire quelque chose comme:Existe-t-il un moyen de rendre Python interactif au milieu d'un script?

do lots of stuff to prepare a good environement 
become_interactive 
#wait for Ctrl-D 
automatically clean up 

Est-il possible avec python Si non, ne vous vois une autre façon de faire la même chose?

+3

Merci à tous! Pour mémoire, la meilleure façon d'utiliser le module de code pour ce faire est le suivant: code d'importation code.interact (= GLOBALS locales()) –

+2

Pour obtenir des variables locales dans l'espace de noms aussi bien, vous avez besoin ' code.interact (local = dict (globals(), ** locals()) '. Notez l'ajout de' ** locals' Je me posais cette question moi-même, et votre commentaire était la meilleure réponse que j'ai trouvée: - –

Répondre

5

Avec IPython v1.0, vous pouvez simplement utiliser

from IPython import embed 
embed() 

avec plus d'options présentées dans le docs.

+0

Vous pouvez l'utiliser n'importe où et il préserve la portée. –

-1

Vous pouvez appeler python lui-même:

import subprocess 

print "Hola" 

subprocess.call(["python"],shell=True) 

print "Adios" 
8

Le module code vous permettra de démarrer un Python REPL.

5

Ce n'est pas exactement ce que vous voulez, mais python -i lancera une invite interactive après l'exécution du script.

-i: inspectent de manière interactive après l'exécution du script, (aussi PYTHONINSPECT = x) et invites de force, même si stdin ne semble pas être un terminal

$ python -i your-script.py 
Python 2.5.4 (r254:67916, Jan 20 2010, 21:44:03) 
... 
>>> 
10

Utilisez le drapeau -i lorsque vous démarrez Python et définissez un gestionnaire atexit à exécuter lors du nettoyage.

fichier script.py:

import atexit 
def cleanup(): 
    print "Goodbye" 
atexit.register(cleanup) 
print "Hello" 

puis vous venez de commencer Python avec le drapeau -i:

C:\temp>\python26\python -i script.py 
Hello 
>>> print "interactive" 
interactive 
>>> ^Z 

Goodbye 
6

Pour élaborer sur la réponse de l'IVA: embedding-a-shell, incoporating code et ipython.

def prompt(vars=None, message="welcome to the shell"): 
    #prompt_message = "Welcome! Useful: G is the graph, DB, C" 
    prompt_message = message 
    try: 
     from IPython.Shell import IPShellEmbed 
     ipshell = IPShellEmbed(argv=[''],banner=prompt_message,exit_msg="Goodbye") 
     return ipshell 
    except ImportError: 
     if vars is None: vars=globals() 
     import code 
     import rlcompleter 
     import readline 
     readline.parse_and_bind("tab: complete") 
     # calling this with globals ensures we can see the environment 
     print prompt_message 
     shell = code.InteractiveConsole(vars) 
     return shell.interact 

p = prompt() 
p()