几乎每次在Django中使用manage.py shell时,我都希望导入某些东西。例如,我想从models.py模块导入*。目前,我的工作是将所有导入文件放在一个名为s.py的文件中,然后在启动shell后键入execfile(".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时自动执行这些导入。
shell子命令只需调用一个交互式Python解释器,因此将PYTHONSTARTUPUNIX环境变量指向包含所需导入的文件即可。顺序如下:
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。这种方法增加了灵活性。
检查django扩展,它提供了一个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)
请注意,还会导入自定义应用程序模型。
我认为您不应该覆盖默认的shell或manage.py命令,因为您将在其他地方使用它们。如果你有一个本地设置文件,你可能想把它们添加到你的本地设置文件中,但如果你不小心,你可能会以循环导入告终。此外,您应该编写自己的扩展到shell
检查此项:
https://github.com/django-extensions/django-extensions/blob/master/django_extensions/management/shells.py
有一个django扩展,它是 shell_plus。
1。pip安装django扩展
2。将"django扩展"添加到您的设置中。py的INSTALLED_APPS[]
3。运行命令>>>>python manage.py shell_plus
创建一个新的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
的命令文件中。