2013-02-02 223 views
2

我剛剛安裝了IPython 0.13.1,並遇到兩個問題。我有一個包含所謂的「應用程序」應用程序中的小「示範」項目:如何使用IPython重新加載和自動重新加載?

. 
├── 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中,導入我的客戶類,並嘗試重新加載模型模塊,我得到這個錯誤:

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設置。我也嘗試重新加載(應用程序)和重新加載(模型)沒有成功。我究竟做錯了什麼?

我的第二個問題是使用自動重載。閱讀文檔頁面後,我能這樣說:

In [1]: %load_ext autoreload 
In [2]: %autoreload 2 

現在,如果我創建一個測試文件「foo.py」,在它的一些功能如文檔說明,任何改變我作出這個函數反映在IPython中。但是,如果我導入我的Customer類(如上所示)併爲其添加第二個字段「lname」並保存該文件,則該更改不會反映在IPython中。如果我運行命令「客戶??」,則更改不會顯示。另外,如果我運行aimport命令,我看到:

In [5]: %load_ext autoreload 
In [6]: %autoreload 2 
In [7]: %aimport 
Modules to reload: 
all-except-skipped 

Modules to skip: 

我在做什麼錯?這是討論here的AppCache問題嗎?我嘗試實現顯示的腳本,但是當我運行它時會引發錯誤。謝謝。

回答

1

對於您的第一個問題,您不能reload(app.models),因爲您沒有將app.models添加到您的名稱空間。您只添加了Customer。你可以添加import app.models來解決這個問題。

我認爲你的第二個問題是相關的。由於您將實際的類導入到您的名稱空間中,重新加載無助於您。大概重新加載只會取代名稱空間中的模塊,因此如果您參考models.Customer而不是直接使用Customer,則應該開展業務。

+0

當我實現你的第一個建議時,我看到一個很長的模型列表被重新加載,但是當它到達'select'時我得到一個ValueError:「無法配置過濾器'require_debug_false':'DictConfigurator'類型的對象沒有len ()。我會再去找更多的。 – William

+0

我一直在追蹤這個錯誤,當重載到'select'時,會產生一個ValueError,它發生在autoreload.py的第243行:superreload(m, reload,self.old_objects)ValueError:無法配置過濾器'require_debug_false':'DictConfigurator'類型的對象沒有len()。我不知道如何解決這個問題。 – William

+0

有趣的是,如果我加載autoreload擴展並添加字段'lname'到Customer類,我會看到新的字段,如果我做了「Customer?」。但是,如果我嘗試創建一個新的Customer對象並加載此字段,則會得到「TypeError:'lname'關鍵字參數對於這個功能。「我懷疑這是因爲重新加載無法正常工作。 – William