2012-09-08 10 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た問題を引き起こしている可能性があります見えました。それは、次のコードを持っていた:私は、我々が以前に書いたadmin.pyファイルが最新のマージで削除されたことがわかり、この頃そう

from django.contrib import admin 
admin.autodiscover() 

をしかしadmin.pycはまだ存在していること。 .pycファイルを削除すると、円形のインポートエラーが修正され、今は問題なく動作しているようです。

私の質問は次のとおりです。ここで正確に何が起こったのですか? Gitはすべてのpycファイルを無視するように設定されているので、.pyがマージされた後は、.pyが削除されても動きません。しかし、.py自体が削除された場合、.pyc内のコンパイル済みコードを呼び出さないように、Pythonは十分スマートであってはいけませんか?

+0

削除されていることはわかりません。実際には、 'py'がない場合や' py'が古い場合は常に 'pyc'を使用しようとします。 –

+0

これをあなたの 'root_directory/.gitignore'ファイルに追加します:' * .pyc'。 gitはPythonのバイトコードを無視するように指示します。 'pyc'をリポジトリの一部にするのは良い考えではありません。それぞれのローカル機能がそれらを編集するので、新しいモジュールを持っていない他の人にそれらをプッシュするとランタイムエラーが発生する可能性があります。 –

答えて

8

実際には、Pythonは.pycファイルを使用し、a)が存在し、b)が.pycファイルよりも新しい場合にのみ、.pyファイルにアクセスします。

これによりPythonアプリケーションをソースコードなしでコンパイルされた形式で配布することができます(ただし、コードの難読化はほとんどありません)。

+1

この機能により、Linuxディストリビューションはインストールされたパッケージの '.py'ファイルを一箇所に置くことができ、各Pythonバージョンの' lib'ディレクトリに '.pyc'ファイルを置くことができます。 –

2

あなたはこれを防ぐために行うことができます事は

python -B manage.py runserver 

またはおそらくジャンゴ・エクステンション

./manage.py clean_pyc 
4

からclean_pycで、PYCの削除を自動化するとジャンゴを開始することであるいや、Pythonは(あります意図的に、以下を参照してください)これについてダムしてください!あなたのプロジェクトディレクトリから

find . -name '*.pyc' -delete 

を実行して、古い.pycファイルを取り除くことができます。

gitを使用している場合、set up a hookをチェックアウト時に自動的に行うことができます。 Mercurialの場合はsimilar solutionです。

+2

私はこれを「ダム」と呼んでいません。これをサポートすることが意図的な設計上の決定であり、いくつかのユースケースがあります。それは機能です。 –

関連する問題