2012-09-08 64 views
9

我今天使用Git拉最新代碼,我得到了以下錯誤:爲什麼舊的.pyc文件會破壞Django?

ImportError at/
cannot import name Like 

這可能是與圓形進口。我檢查了回溯:

Traceback: 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/core/handlers/base.py" in get_response 
    101.        request.path_info) 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/core/urlresolvers.py" in resolve 
    298.    for pattern in self.url_patterns: 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/core/urlresolvers.py" in url_patterns 
    328.   patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/core/urlresolvers.py" in urlconf_module 
    323.    self._urlconf_module = import_module(self.urlconf_name) 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/utils/importlib.py" in import_module 
    35.  __import__(name) 
File "/Users/Desktop/python/mystuff/Project/Project/urls.py" in <module> 
    7. admin.autodiscover() 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/contrib/admin/__init__.py" in autodiscover 
    29.    import_module('%s.admin' % app) 
File "/Library/Python/2.7/site-packages/Django-1.4.1-py2.7.egg/django/utils/importlib.py" in import_module 
    35.  __import__(name) 

在那裏的唯一代碼,它看起來可能會造成的問題是urls.py。這有以下代碼:

from django.contrib import admin 
admin.autodiscover() 

所以在這個時候我發現,我們以前寫的admin.py文件中的最新的合併已被刪除,但該admin.pyc依然存在。刪除.pyc文件繼續修復循環導入錯誤,現在看起來工作正常。

我的問題是:究竟發生了什麼? Git被配置爲忽略所有pyc文件,因此在合併之後,即使.py被刪除,.pyc也會被卡住。但是,如果.py本身被刪除,python是否應該足夠聰明,不要嘗試調用.pyc中的任何編譯代碼?

+0

它不知道它被刪除了,如果沒有'py'或者'py'比較老,它實際上總是試圖使用'pyc'。 –

+0

將此添加到您的'root_directory/.gitignore'文件:'* .pyc'。它會告訴git忽略python字節碼。將'pyc'作爲repo的一部分並不是一個好主意,因爲每個本地特性都會對它們進行編輯,如果將它們推送給沒有新模塊的其他用戶,則可能會導致運行時錯誤。 – 2012-09-08 23:13:13

回答

8

不,實際上,Python將優先使用.pyc文件,並且只有在a)存在且b)文件比.pyc文件更新時才訪問.py文件。

這允許您以編譯形式發佈Python應用程序,而無需使用源代碼(儘管這不是代碼「混淆」技術)。

+1

該功能還允許Linux發行版在一個地方安裝已安裝軟件包的'.py'文件,並將'.pyc'文件放入每個Python版本的'lib'目錄(這可能是更有用的應用程序)。 –

2

你可以做些什麼來防止這種事情是與

python -B manage.py runserver 

開始Django的或自動PYC的缺失,可能與Django的擴展

./manage.py clean_pyc 
4

不,Python是clean_pyc(故意,見下文)愚蠢的這個!您可以運行

find . -name '*.pyc' -delete 

從您的項目目錄中擺脫舊的.pyc文件。

如果你正在使用git,你可以set up a hook在結帳時自動完成。這是Mercurial的similar solution

+2

我不會稱之爲「啞巴」。這是一個有意的設計決定來支持這一點,它有幾個用例。這是一個功能。 –

相關問題