7

刚开始使用 Mercurial。哇,不错的应用。我将我的数据库文件移出代码目录,但我想知道这些.pyc文件。我没有将它们包含在初始提交中。有关该.hgignore文件的文档包含一个要 exclude 的示例*.pyc,因此我认为我走在正确的轨道上。

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

4

4 回答 4

14

正如 ms4py 的回答中提到的, *.pyc 是已编译的文件,将即时重新生成。在分发项目时,您不希望包含这些内容。

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

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

find . -name '*.pyc' -exec rm {} \;
于 2012-06-06T20:49:26.933 回答
5

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

如果您删除一个*.py文件并且您仍然从另一个文件中导入它,则会出现问题。*.pyc在这种情况下,如果文件存在,您将从文件中导入。但这将是您的代码中的一个错误,并且与您的反复无常的工作流程没有真正的关系。

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

于 2012-06-06T19:31:48.990 回答
3

对于更通用的解决方案,请询问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。

于 2012-06-07T21:50:02.027 回答
0

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

如果这意味着.pyc不反映您当前的版本,那么是的,您将不得不删除所有.pyc文件。

如果你在linux上,你可以find . -name *.pyc -delete

于 2012-06-06T19:05:02.590 回答