4

几乎每次我在 Django 中使用 manage.py shell 时,我都想导入某些东西。例如,我想从我的 models.py 模块中导入 *。目前,我的解决方法是将所有导入文件放在一个名为 s.py 的文件中,然后在启动 shell 后键入 execfile('s.py')。

如何自定义 manage.py 以便在我启动 shell 时自动执行导入?我正在使用 Django 1.4。谢谢你。

编辑:我正在添加更多细节以使我的问题更清楚。

这是我最初所做的:

bash> python manage.py shell
>>> from mysite.app.models import *
>>> from mysite.app2.models import *
>>> import decimal
>>> D = decimal.Decimal
# Now I am ready to work in this shell.

每次启动 shell 时都输入 4 行样板代码很烦人。所以我把这 4 行放在一个文件中s.py。现在我这样做:

bash> python manage.py shell
>>> execfile('s.py')
# Now I am ready to work.

我也想摆脱execfile('s.py')。我想manage.py在启动 shell 时自动进行这些导入。

4

5 回答 5

1

检查django-extensions,它提供了一个shell_plus管理命令,可以自动导入已安装应用程序的所有模型:

user@host:~/git/project (devel)$ ./manage.py shell_plus
# Shell Plus Model Imports
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
from custom_app1.models import MyModel1
from custom_app2.models import MyModel2
from custom_app3.models import MyModel3
# Shell Plus Django Imports
from django.utils import timezone
from django.conf import settings
from django.core.cache import cache
from django.db.models import Avg, Count, F, Max, Min, Sum, Q, Prefetch, Case, When
from django.core.urlresolvers import reverse
from django.db import transaction
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

请注意,自定义应用程序模型也会被导入。

于 2018-04-05T23:09:13.860 回答
1

shell子命令只是调用交互式 Python 解释器,因此将 PYTHONSTARTUP UNIX 环境变量指向包含所需导入的文件将起作用。这是顺序:

user@linux$ export PYTHONSTARTUP='/path/to/my/django/pythonStartup.py'; python ./manage.py shell

其中pythonStartup.py是任意命名的,您可以将其命名为任何您喜欢的名称,包括s.py(尽管这可能不是最好的名称)。=:)

您还可以在您的个人.bash_profile中为其创建以下便利别名:

alias django-shell="export PYTHONSTARTUP='/path/to/my/django/pythonStartup.py'; python ./manage.py shell"

然后简单地使用它:

user@linux$ . ${HOME}/.bash_profile  # Normally you don't need to do this step.
user@linux$ django-shell

现在,您只需要编辑pythonStartup.py文件以合并您可能需要的对导入行为的任何更改,并且只需运行别名(...无需编辑或重新获取您的.bash_profile)。

以下是当我运行python3 ./manage.py shell时发生的情况,其中 PYTHONSTARTUP 环境变量正确指向我希望导入的文件:

user@linux$ python3 ./manage.py shell
Python 3.5.1 |Anaconda custom (64-bit)| (default, Dec  7 2015, 11:16:01) 
Type "copyright", "credits" or "license" for more information.

IPython 4.2.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

Importing base set of modules often used ...

import sys, os, random, pprint, operator
import time, math
import numpy, numpy as np
import numpy.linalg
import scipy, scipy as spimport scipy.optimize
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import pandas as pd
import sklearn.datasets
import sklearn.feature_extraction
import sklearn.linear_model
import sklearn.neighbors
import sklearn.cluster
import sklearn.preprocessing
import sklearn.decomposition
import gensim.models.word2vec

In [1]:

编辑:

我忘记提及的另一个提示。

如果将pythonStartup.py放在 Django 项目的根目录中,则创建别名如下:

alias django-shell="export PYTHONSTARTUP='./pythonStartup.py'; python ./manage.py shell"

允许您cd到您当前正在处理的任何 Django 项目的根目录,并且别名将调用该特定项目的pythonStartup.py。这种方法增加了灵活性。

于 2016-05-18T17:12:50.187 回答
0

我认为您不应该覆盖默认的 shell 或 manage.py 命令,因为您将在其他地方使用它们。如果您有本地设置文件,您可能希望将它们添加到本地设置文件中,但如果您不小心,最终可能会出现循环导入。此外,您应该编写自己的 shell 扩展

检查这个:

https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/shells.py
于 2013-06-25T00:35:00.133 回答
0

有一个 django 扩展,它的 shell_plus

1 . pip install django-extensions

2 . 将“django-extensions”添加到您的 settings.py 的 INSTALLED_APPS[]

3 . 运行命令 >>>>> python manage.py shell_plus

于 2018-04-13T22:13:44.307 回答
0

创建一个新的 shell 命令来继承和隐藏原始命令并运行任意代码并不难。

我敢肯定这一定是个坏主意……但这很容易!我用它!

这是一个例子:

from django.core.management.commands.shell import Command as ShellCommand


class Command(ShellCommand):
    def ipython(self, options):
        print("REMINDER - THIS IS JOHN'S HACKED SHELL")
        from IPython import start_ipython

        script_to_run_on_startup = """
        from django.conf import settings
        from my_app.models import MyModel


        expected_variables = ['In','Out','get_ipython','exit','quit', 'expected_variables']
        available_variables = [k for k in locals().keys() if k[0] != '_' and k not in expected_variables]

        print(f'\\navailable_variables:\\n{available_variables}')
        """

        argv = ['-c', script_to_run_on_startup, '-i']

        start_ipython(argv)

现在把它放在一个名为shell.py.

于 2020-03-13T05:20:16.950 回答