如何使用IPython重新加载和自动重新加载?
如何使用IPython重新加载和自动重新加载?
我刚刚安装了IPython 0.13.1,并且遇到了两个问题。我有一个名为\'app\'的小型\'demo\'项目:\n
. ├── 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
\nmodels.py包含:\n
from django.db import models class Customer(models.Model): fname = models.CharField(max_length=25)
\n我的第一个问题是在我修改models.py文件后重新加载它。如果我打开IPython,导入我的Customer类,并尝试重新加载models模块,我会得到以下错误:\n
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() ----> 1 reload(app.models) NameError: name 'app' is not defined
\n虽然我是Python的新手,但我确信\'models\'是一个模块,并且它在我的INSTALLED_APPS设置中。我还尝试了reload(app)和reload(models),但都没有成功。我做错了什么?\n我的第二个问题是在使用autoreload时。阅读了文档页面后,我像这样启用它:\n
In [1]: %load_ext autoreload In [2]: %autoreload 2
\n现在,如果我创建一个名为\'foo.py\'的测试文件,并在其中添加一些函数,如文档所示,我对该函数所做的任何更改都会在IPython中反映出来。但是,如果我导入我的Customer类(如上所示)并向其添加第二个字段“lname”,然后保存文件,这个更改不会在IPython中反映出来。如果我运行命令“Customer??”,更改不会显示出来。此外,如果我运行aimport命令,我会看到以下内容:\n
In [5]: %load_ext autoreload In [6]: %autoreload 2 In [7]: %aimport Modules to reload: all-except-skipped Modules to skip:
\n我做错了什么?这是在这里讨论的AppCache问题吗?我尝试实现所显示的脚本,但运行时会抛出错误。谢谢。
问题出现的原因是因为在重新加载(reload)和自动重新加载(autoreload)时,命名空间中没有正确导入模块或类。解决方法是添加正确的导入语句或使用完整的模块名称来引用类。
首先,无法通过reload(app.models)
重新加载模块,因为没有将app.models
导入到命名空间中。解决方法是添加import app.models
语句。
其次,当将类直接导入到命名空间中时,重新加载并不起作用。解决方法是使用models.Customer
而不是直接使用Customer
来引用类。
在尝试了上述解决方法后,出现了一个新的错误。在重新加载到"select"时,抛出了一个ValueError错误:"Unable to configure filter 'require_debug_false': object of type 'DictConfigurator' has no len()"。需要进一步探索该错误的解决方法。
有趣的是,如果加载了自动重新加载扩展并在Customer类中添加了一个字段"lname",则可以通过"Customer??"看到新添加的字段。然而,如果尝试创建一个新的Customer对象并加载该字段,将会出现"TypeError: 'lname' is an invalid keyword argument for this function"错误。这可能是由于重新加载没有正常工作导致的。
根据提供的链接,这个问题似乎与一个相关问题有关:[stackoverflow.com/questions/7410151/...](http://stackoverflow.com/questions/7410151)