为什么一个旧的.pyc文件破坏了Django?

Chr*_*ris 11 python django

我今天使用git删除了最新的代码,我收到以下错误:

ImportError at /
cannot import name Like
Run Code Online (Sandbox Code Playgroud)

这可能与循环导入有关.我检查了追溯:

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)
Run Code Online (Sandbox Code Playgroud)

看起来可能导致问题的唯一代码是urls.py.那有以下代码:

from django.contrib import admin
admin.autodiscover()
Run Code Online (Sandbox Code Playgroud)

所以在这个时候我注意到我们之前编写的admin.py文件在最新的合并中被删除了但是admin.pyc仍然存在.删除.pyc文件继续修复循环导入错误,现在似乎工作正常.

我的问题是:这到底发生了什么?Git配置为忽略所有pyc文件,因此在合并之后,即使.py被删除,.pyc也会卡住.但是,如果.py本身被删除,那么python是否应该足够聪明,不要尝试调用.pyc中的任何编译代码?

Tim*_*ker 10

不,实际上,Python .pyc最好使用该文件,只有.py当a)存在且b)比.pyc文件更新时才访问该文件.

这使您可以分布在编译形式的Python应用程序没有源代码(虽然这不是太大的代码"加密"技术).


ecm*_*all 5

不,Python在这个问题上是愚蠢的(有意地见下文)!你可以跑

find . -name '*.pyc' -delete
Run Code Online (Sandbox Code Playgroud)

从您的项目目录中删除旧.pyc文件。

如果您使用的是git,则可以设置一个挂钩以在结帐时自动执行此操作。这是针对Mercurial 的类似解决方案

  • 我不会称其为“哑巴”。支持此决定是有意的设计决定,并且它具有多个用例。这是一个功能。 (3认同)