我刚刚安装了IPython 0.13.1并且遇到了两个问题。我有一个小的'demo'项目,其中包含一个名为'app'的应用程序:
.
├── app
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── models.py
│ ├── models.pyc
│ ├── tests.py
│ └── views.py
├── demo
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
└── manage.py
models.py包含:
from django.db import models
class Customer(models.Model):
fname = models.CharField(max_length=25)
我的第一个问题是在我做出更改后重新加载models.py文件。如果我打开IPython,导入我的Customer类,并尝试重新加载模块模块,我收到此错误:
In [1]: from app.models import Customer
In [2]: reload(app.models)
--------------------------------------------------
NameError Traceback(most recent call last)
/Users/me/dotfiles/.virtualenvs/demo/lib/.../shell.pyc in <module>()
----> 1 reload(app.models)
NameError: name 'app' is not defined
虽然我是Python的新手,但我确实相信“模型”是模块,我在INSTALLED_APPS设置中。我也试过重装(app)和重装(模型)没有成功。我做错了什么?
我的第二个问题是使用自动加载。阅读完doc文档后,我启用了它:
In [1]: %load_ext autoreload
In [2]: %autoreload 2
现在,如果我创建一个测试文件'foo.py',其中包含一些函数,正如文档所示,我对该函数所做的任何更改都会反映在IPython中。但是如果我导入我的Customer类(如上所示)并向其添加第二个字段“lname”并保存文件,则该更改不会反映在IPython中。如果我运行命令“Customer ??”,则不会显示更改。另外,如果我运行aimport命令,我会看到:
In [5]: %load_ext autoreload
In [6]: %autoreload 2
In [7]: %aimport
Modules to reload:
all-except-skipped
Modules to skip:
我做错了什么?这是AppCache问题所讨论的here吗?我尝试实现显示的脚本但是在运行它时会抛出错误。感谢。
答案 0 :(得分:2)
对于您的第一个问题,您不能reload(app.models)
,因为您没有将app.models
添加到命名空间。您只添加了Customer
。您可以添加import app.models
来解决此问题。
我认为你的第二个问题是相关的。由于您将实际的类导入了命名空间,因此重新加载没有帮助。据推测,重新加载只会替换名称空间中的模块,因此如果您引用models.Customer
而不是直接使用Customer
,那么您应该开始营业。