你如何使用IPython重新加载和自动重载?

时间:2013-02-02 01:03:07

标签: python ipython

我刚刚安装了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吗?我尝试实现显示的脚本但是在运行它时会抛出错误。感谢。

1 个答案:

答案 0 :(得分:2)

对于您的第一个问题,您不能reload(app.models),因为您没有将app.models添加到命名空间。您只添加了Customer。您可以添加import app.models来解决此问题。

我认为你的第二个问题是相关的。由于您将实际的类导入了命名空间,因此重新加载没有帮助。据推测,重新加载只会替换名称空间中的模块,因此如果您引用models.Customer而不是直接使用Customer,那么您应该开始营业。