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

8 浏览
0 Comments

如何使用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问题吗?我尝试实现所显示的脚本,但运行时会抛出错误。谢谢。

0
0 Comments

问题出现的原因是因为在重新加载(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)

0