2012-04-08 6 views
7

Quiero utilizar un shell IPython incrustado con un diccionario user_ns y una configuración de mi perfil (ipython_config.py y los archivos de inicio). El objetivo es ejecutar un shell Django con modelos importados al inicio. django-extensions implementa un comando llamado shell_plus que hace esto:Ejecución de archivos de inicio de perfil en una instancia incrustada de IPython t

https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/commands/shell_plus.py

from IPython import embed 
embed(user_ns=imported_objects) 

El problema es que esto no se carga mis archivos de inicio. Embed() llama a load_default_config() que calculo carga ipython_config.py.

¿Cómo hago para que la instancia incrustada de IPython ejecute los archivos de inicio de mi perfil?

+0

Lo mismo ocurre con 'manage.py shell', los archivos de inicio no se ejecutan. Espero que arreglen esto pronto. (ps, v 0.13) – Paolo

Respuesta

1

he utilizado la siguiente solución para dirigir mi propio script de inicio IPython pero aún así tomar ventaja de shell_plus:

  1. crear un archivo llamado shell_plus_startup.py en el mismo directorio que manage.py. Por ejemplo:

    # File: shell_plus_startup.py 
    # Extra python code to run after shell_plus starts an embedded IPython shell. 
    # Run this file from IPython using '%run shell_plus_startup.py' 
    
    # Common imports 
    from datetime import date 
    
    # Common variables 
    tod = date.today() 
    
  2. shell lanzamiento más (que lanza un IPython shell integrado).

    python manage.py shell_plus

  3. ejecutar manualmente el script de inicio.

    In [1]: %run shell_plus_startup.py 
    
  4. A continuación, puede utilizar las variables que ha definido, los módulos que haya importado, etc.

    In [2]: tod 
    Out[2]: datetime.date(2012, 7, 14) 
    

Véase también esta respuesta: scripting ipython through django's shell_plus

0

he encontrado una manera eso funciona si estás usando django-extensions-shell_plus. Es un poco raro, pero de esta manera su archivo de inicio se carga de manera totalmente automática y no tiene que escribir ningún comando de ejecución al comienzo de su sesión ipython.

Por lo tanto, edité el archivo shells.py desde el directorio django_extensions, que en mi caso se encuentra en /usr/local/lib/python2.7/dist-packages/django_extensions/management/shells.py. Agregué estas líneas dentro de la función import_objects(options, style):, por lo que importa el contenido del archivo startup.py definido por el parámetro de entorno PYTHONSTARTUP.

def import_objects(options, style): 
    # (...) 
    import os, sys, pkgutil 
    if 'PYTHONSTARTUP' in os.environ: 
     try: 
      sys.path.append(os.environ['PYTHONSTARTUP']) 
      import startup 
      content = [element for element in dir(startup) if not element.startswith('__')] 
      for element in content: 
       imported_objects[element] = getattr(startup, element) 
     except Exception, ex: 
      sys.exit("Could not import startup module content, Error:\n%s" % ex) 

Ahora cuando lance shell_plus-shell, le doy la variable de entorno a mi secuencia de comandos python de inicio. Mi escritura del golpe para poner en marcha la cáscara con todo en su lugar se parece a esto:

#!/bin/bash 
export PYTHONSTARTUP=/home/ifischer/src/myproject/startup.py # tells shell_plus to load this file 
python /home/ifischer/src/myproject/manage.py shell_plus --ipython 

Ahora tienen acceso a todos los métodos y variables definidas en startup.py desde el inicio de la sesión ipython.

Para poder reutilizar eso y tener archivos de inicio personalizados para cada proyecto, precargando diferentes aspectos.

Quizás haya una manera más clara de incluir las líneas que agregué al shells.py?Pero este enfoque funciona bien para mí por ahora.

+0

Introduje los cambios anteriores en mi fork de django-extensions: https://github.com/ifischer/django-extensions – ifischer

Cuestiones relacionadas