如何在IPython中重载和自动重载?
我刚安装了IPython 0.13.1,遇到了两个问题。我有一个小的“演示”项目,里面有一个叫做'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类,然后尝试重新加载models模块,就会出现这个错误:
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还很陌生,但我相信'models'就是模块,而且它已经在我的INSTALLED_APPS设置里。我也试过用reload(app)和reload(models),但都没有成功。我到底哪里做错了呢?
第二个问题是关于使用自动重载的。在看完文档后,我这样启用了它:
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问题吗?我试过实现文档里显示的脚本,但运行时却报错。谢谢。
1 个回答
关于你的第一个问题,你不能使用 reload(app.models)
,因为你没有把 app.models
加入到你的命名空间里。你只添加了 Customer
。你可以通过添加 import app.models
来解决这个问题。
我觉得你的第二个问题也和这个有关。因为你已经把实际的类导入到你的命名空间里,所以重新加载并没有什么帮助。重新加载只是把模块替换掉,所以如果你使用 models.Customer
而不是直接用 Customer
,这样就可以正常工作了。