当Django或python与Mercurial一起使用时,如何处理pyc文件?

当Django或python与Mercurial一起使用时,如何处理pyc文件?,python,django,mercurial,pyc,Python,Django,Mercurial,Pyc,刚开始使用Mercurial。哇,很好的应用程序。我将数据库文件移出了代码目录,但我想知道.pyc文件。我没有在最初的提交中包含它们。关于.hgignore文件的文档包括一个排除*.pyc的示例,因此我认为我的思路是正确的 我想知道当我决定回滚到旧文件集时会发生什么。那么我需要删除所有.pyc文件吗?我看到一些关于堆栈溢出的问题,包括一位先生发现使用了旧的.pyc文件。解决这个问题的标准方法是什么?当然,如果您有一个.pyc文件,来自同一模块的较旧版本,python将使用该文件。很多次我都想知道

刚开始使用Mercurial。哇,很好的应用程序。我将数据库文件移出了代码目录,但我想知道
.pyc
文件。我没有在最初的提交中包含它们。关于
.hgignore
文件的文档包括一个排除
*.pyc
的示例,因此我认为我的思路是正确的


我想知道当我决定回滚到旧文件集时会发生什么。那么我需要删除所有
.pyc
文件吗?我看到一些关于堆栈溢出的问题,包括一位先生发现使用了旧的
.pyc
文件。解决这个问题的标准方法是什么?

当然,如果您有一个
.pyc
文件,来自同一模块的较旧版本,python将使用该文件。很多次我都想知道为什么我的程序没有反映我所做的更改,并且意识到这是因为我有旧的pyc文件

如果这意味着
.pyc
没有反映您当前的版本,那么您必须删除所有
.pyc
文件


如果您在linux上,您可以
查找-name*.pyc-delete

通常您是安全的,因为如果相应的
*.py
更改其内容,则会重新生成
*.pyc

如果删除了
*.py
文件,但仍在另一个文件中从中导入,则会出现问题。在这种情况下,如果存在
*.pyc
文件,则从该文件导入。但这将是您的代码中的一个bug,与您的mercurial工作流并没有真正的联系


结论:每个著名的Python库都忽略了它们的
*.pyc
文件,就这样做吧;)

如ms4py的回答中所述,*.pyc是编译后的文件,将动态重新生成。您不希望在分发项目时包含这些内容

但是,如果您在回滚更改时有以前存在的模块,并且*.pyc文件被保留,那么即使原始python文件不再存在,也会出现奇怪的错误,因为pyc文件可以执行。在Django中,当在项目中添加和删除应用程序以及使用git切换分支时,这几次让我感到痛苦

要清理这些内容,可以通过在项目目录中运行以下shell命令来删除项目目录中的所有编译文件:

find . -name '*.pyc' -exec rm {} \;

要获得更一般的解决方案,请询问Mercurial本身它忽略了哪些文件:

$ hg status --ignored
您可以使输出对
xargs
消费安全:

$ hg status --ignored --no-status -0 | xargs -0 -delete
(处理名称中带有空格的文件时,
-0
非常重要。)您可以将其安装为更新后挂钩:

[hooks]
post-update = hg status --ignored --no-status -0 | xargs -0 -delete
最后,Mercurial还提供了一个类似的功能:

$ hg purge --all

将同时删除未跟踪和忽略的文件。如果您不介意丢失未跟踪的文件,那么该命令对您来说可能是最简单的,特别是因为它也适用于
xargs
可能很难获得的Windows。

您在Linux下使用Mercurial吗?您是使用命令行
hg
app还是某种GUI应用程序?我更喜欢在开发过程中设置PythontWriteByteCode,以避免pyc带来的麻烦。->Kirill:我在MacOS X下使用Mercurial进行Django web开发,用于我的医疗实践。当命令行hg应用程序发挥其魔力时,看着文件在GUI中来来往往是很有趣的。->thg435:感谢您指出PYTHONDONTWRITEBYTECODE选项。这是如何回答这个问题的?OP提到在VCS中已经忽略了
.pyc
。我从问题中了解到,@kd4ttc已经这样做了。大多数
find
s也支持
-delete
而不是
-exec rm{}。如果您的代码库没有bug,则默认mercurial工作流中不会出现此问题(因为您从未从没有相应的*.py的*.pyc导入)。好的,看来正确的做法是每隔一段时间执行
hg commit
。如果正在回滚,请运行
find-名称'*.pyc'-delete
作为一个选项在回滚之后。一般来说,最好将*.pyc文件从Mercurial中排除。@ms4py如果将文件从一个包移动到另一个包,也会发生这种情况。我同意。在大多数情况下,事情“只是起作用”。如果您的项目出现了奇怪的行为(例如,您知道正在运行的代码已经不存在了),那么请删除*.pyc文件。否则,不用担心。如果您正在删除模块,但仍在导入模块,希望导入一个ImportError而不是加载一个旧的.pyc文件,那么这可能是您在做一些奇怪的事情的迹象。。。