内联 django shell 与 python shell 中的变量范围
Posted
技术标签:
【中文标题】内联 django shell 与 python shell 中的变量范围【英文标题】:Variables scope in inline django shell, vs python shell 【发布时间】:2013-08-03 14:18:41 【问题描述】:我有问题,django shell 的奇怪行为。我有这个代码:
fields = ('name', 'description', 'long_description', 'foot_description')
a = 1
dict( (field, a) for field in fields)
当我从 python shell 运行它时,它给了我正确的 dict。但是当我从 django shell 运行它时,我得到:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <module>()
----> 1 dict( (field, a) for field in fields)
/usr/local/lib/python2.7/dist-packages/django/core/management/commands/shell.pyc in <genexpr>((field,))
----> 1 dict( (field, a) for field in fields)
NameError: global name 'a' is not defined
我的问题很简单:为什么?
【问题讨论】:
似乎无法在我的 shell 上复制它。 :// 我可以在 Django 1.3 IPython shell 中复制这个错误。 @aychedee 我不能……Out[3]: 'description': 1, 'foot_description': 1, 'long_description': 1, 'name': 1
@OP:你用的是什么版本?我无法在 Django 1.5 上复制它。
我可以在 Django 1.4.1 IPython shell 和 Django IPython shell 1.3.7 上复制它。
【参考方案1】:
好像是a known issue and fixed in Django 1.6。
目前,工单中有一个建议的解决方法。 “抓住以下几行(从这里https://github.com/django/django/blob/master/django/core/management/commands/shell.py)并用这个替换当前的实现(...):
def ipython(self):
try:
from IPython.frontend.terminal.ipapp import TerminalIPythonApp
app = TerminalIPythonApp.instance()
app.initialize(argv=[])
app.start()
except ImportError:
# IPython < 0.11
# Explicitly pass an empty list as arguments, because otherwise
# IPython would use sys.argv from this script.
try:
from IPython.Shell import IPShell
shell = IPShell(argv=[])
shell.mainloop()
except ImportError:
# IPython not found at all, raise ImportError
raise
您也可以通过对同一张票的评论尝试python manage.py shell --plain
。
【讨论】:
以上是关于内联 django shell 与 python shell 中的变量范围的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python/Django 在电子邮件中发送内联图像? [复制]
如何使用 Python/Django 在电子邮件中发送内联图像? [复制]