8

我想使用带有 user_ns 字典和我的配置文件配置(ipython_config.py 和启动文件)的嵌入式 IPython shell。目的是在启动时使用导入的模型运行 Django shell。django-extensions 实现了一个名为 shell_plus 的命令来执行此操作:

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)

问题是这不会加载我的启动文件。embed() 调用 load_default_config(),我认为它会加载 ipython_config.py。

如何让嵌入式 IPython 实例运行我的配置文件启动文件?

4

3 回答 3

1

我使用以下解决方法来运行我自己的 IPython 启动脚本,但仍然利用 shell_plus:

  1. shell_plus_startup.py在同一目录中创建一个名为manage.py. 例如:

    # 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 plus(启动嵌入式 IPython shell)。

    python manage.py shell_plus

  3. 手动运行启动脚本。

    In [1]: %run shell_plus_startup.py
    
  4. 然后你可以使用你定义的变量、你导入的模块等等。

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

另请参阅此答案:scripting ipython through django's shell_plus

于 2012-07-14T21:49:30.677 回答
0

如果您使用 django-extensions-shell_plus,我找到了一种可行的方法。这有点 hacky,但是通过这种方式,您的启动文件会完全自动加载,您不必在 ipython-session 开始时键入任何运行命令。

因此,我shells.py从 django_extensions 目录编辑了文件,在我的情况下,该目录位于/usr/local/lib/python2.7/dist-packages/django_extensions/management/shells.py. 我在函数中添加了这些行import_objects(options, style):,因此它导入了startup.py由环境参数定义的文件的内容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)

现在,当我启动 shell_plus-shell 时,我将环境变量提供给我的启动 python 脚本。我启动 shell 的 bash 脚本如下所示:

#!/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

现在我可以访问从 ipython 会话开始时在 startup.py 中定义的所有方法和变量。

因此,您可以重用它并为每个项目自定义启动文件,预加载不同的方面。

也许有一种更简洁的方法来包含我添加到 shells.py 的行?但是这种方法目前对我来说很好。

于 2013-01-23T10:37:33.107 回答
0

它会自动从django-extensions==1.5.6. 您还可以ipython通过 IPYTHON_ARGUMENTS 传递其他参数。文档: http ://django-extensions.readthedocs.org/en/latest/shell_plus.html#configuration

于 2015-09-07T21:23:46.720 回答