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 文件,因此在合并后 .pyc 仍然存在,即使 .py 已被删除。但是如果 .py 本身被删除,python 不应该足够聪明,不要尝试调用 .pyc 中的任何编译代码吗?

4

3 回答 3

11

不,事实上,Python 将.pyc优先使用该文件,并且仅在该.py文件 a) 存在且 b) 比该文件更新时才访问该.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

或自动删除 pyc,可能使用 django-extensions 中的 clean_pyc

./manage.py clean_pyc
于 2012-09-08T22:26:58.377 回答