django 在嵌入式IPython示例中运行配置文件启动文件

bsxbgnwa  于 2023-03-04  发布在  Go
关注(0)|答案(4)|浏览(158)

我想使用一个嵌入式的IPython shell,里面有user_ns字典和我的配置文件(ipython_config.py和启动文件),目的是运行一个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示例运行我的概要文件启动文件?

3qpi33ja

3qpi33ja1#

我使用了以下解决方案来运行我自己的IPython启动脚本,但仍然利用了shell_plus:
1.在与manage.py相同的目录中创建名为shell_plus_startup.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()

1.启动shell plus(启动嵌入式IPython shell)。
python manage.py shell_plus
1.手动运行启动脚本。

In [1]: %run shell_plus_startup.py

1.然后你可以使用你定义的变量,你导入的模块,等等。

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

另请参见以下答案:scripting ipython through django's shell_plus

vtwuwzda

vtwuwzda2#

我发现了一个方法,如果你使用django-extensions-shell_plus,它是有点笨拙,但是用这个方法你的启动文件是完全自动加载的,你不需要在你的ipython会话开始时输入任何run-command。
因此我从django_extensions目录中编辑了shells.py文件,在我的例子中它位于/usr/local/lib/python2.7/dist-packages/django_extensions/management/shells.py中。我在import_objects(options, style):函数中添加了这些行,这样它就导入了由环境参数PYTHONSTARTUP定义的startup.py文件的内容。

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会话开始时在www.example.com中定义的所有方法和变量startup.py。
因此,您可以重用它,并为每个项目定制启动文件,预加载不同的方面。
也许有一种更干净的方法来包含我添加到www.example.com的行shells.py?但这种方法目前对我来说很好用。

nukf8bse

nukf8bse3#

它会自动从django-extensions==1.5.6开始加载您的ipython配置。您也可以通过IPYTHON_ARGUMENTS向ipython传递其他参数。http://django-extensions.readthedocs.org/en/latest/shell_plus.html#configuration

5anewei6

5anewei64#

另一种方法是使用从InteractiveShellEmbedInteractiveShellApp派生的类。不完整的示例代码:

from IPython.terminal.embed import InteractiveShellEmbed
from IPython.terminal.ipapp import InteractiveShellApp

class ISE(InteractiveShellEmbed, InteractiveShellApp):
    def init_shell(self):
        self.shell = self.instance()
        self.extra_args = []

ise = ISE()
ise.init_path()
ise.init_shell()
ise.init_code()
ise.shell()

相关问题