我的目的是能够启动一个 python shell(ipython、bpython 或简单 python)并且:
- 自动设置设置.py
- 从 INSTALLED_APPS 自动加载模型
- 我知道 ./manage.py shell 和 django.extensions,但我想随心所欲地选择运行什么 shell。
为此,我将这段代码(来自http://agiliq.com/blog/2009/12/using-bpython-shell-with-django-and-some-ipython-f/)放在我的 PYTHONSTARTUP 中:
try:
from django.core.management import setup_environ
import settings
setup_environ(settings)
print 'imported django settings'
try:
exec_strs = ["from %s.models import *"%apps for apps in settings.INSTALLED_APPS ]
for x in exec_strs:
try:
exec(x)
except Exception,e:
print 'Not imported for %s' %x
print "Exception:%s" %repr(e)
print 'imported django models'
except:
pass
except:
pass
这在 bpyton/python 中工作正常。Ipython 忽略了它,所以我自定义了 ipy_user_conf.py 来加载它:
import os
try:
if os.environ.get("PYTHONSTARTUP",None) is not None:
execfile(os.environ.get("PYTHONSTARTUP"))
except:
pass
然而,这失败了,并且似乎永久地破坏了 ipython 的导入,并带有令人费解的诊断:
Not imported for from tick.et.models import *
Exception:ValueError("Unable to configure handler 'mail_admins': __import__() argument 1 must be string, not DictConfigurator",)
谷歌搜索揭示了与 Django 使用日志工具的方式有关的问题,细节超出了我的理解。但请注意,manage.py shell 使用 python 很好,没有上述问题。问题因此变成了,我做错了什么?
之后
在对http://bugs.python.org/issue12718进行了一些挖掘和仔细阅读之后- 看来问题是由 winpdb/rpdb2 的错误(安装在我的盒子上)错误地包装了 python 的内置导入引起的。我想 django 也覆盖了 import,这就是 manage.py 逃脱这个特殊障碍的原因。我仍然很想知道是否存在外部修复(即缺少修补 rpdb2)。
后来还是
我将此问题报告为 winpdb 网站上的错误。没有结束问题,因为可用的理由似乎都不适用。