12

今日、git を使用して最新のコードをプルしたところ、次のエラーが発生しました。

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自体が削除された場合、.pycでコンパイルされたコードを呼び出そうとしないように、pythonは十分に賢くあるべきではありませんか?

4

3 に答える 3

11

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

これにより、Python アプリをソース コードなしでコンパイルされた形式で配布できます (ただし、コードの「難読化」手法はそれほど多くありません)。

于 2012-09-08T22:19:32.100 に答える
9

いいえ、Python は (意図的に、以下を参照してください) これについて馬鹿げています! 実行できます

find . -name '*.pyc' -delete

プロジェクト ディレクトリから古い.pycファイルを削除します。

git を使用している場合は、チェックアウト時にこれを自動的に行うようにフックを設定できます。Mercurialの同様のソリューションを次に示します。

于 2012-09-08T22:28:18.873 に答える
2

これを防ぐためにできることは、djangoを起動することです

python -B manage.py runserver

または、おそらくdjango-extensionsのclean_pycを使用して、pycの削除を自動化します

./manage.py clean_pyc
于 2012-09-08T22:26:58.377 に答える