移动相应的py时自动删除pyc文件(Mercurial)

Odd*_*ing 15 python mercurial

(我预见到这个问题可能发生在3个月前,并被告知要努力避免它.昨天,我被它咬了,很难,现在它花了我真钱,我很想解决它.)

如果我将我的一个Python源文件移动到另一个目录中,我需要记住告诉Mercurial它移动了(hg move).

当我使用Mercurial将新软件部署到我的服务器时,它会小心地删除旧的Python文件并在新目录中创建它.

但是,Mercurial并不知道同一目录中的pyc文件,并将其遗留下来.旧的pyc优先于同一目录中的其他模块使用新的python文件.

随之而来的不是欢闹.

当我移动python文件时,如何说服Mercurial自动删除旧的pyc文件?还有其他更好的做法吗?试图记住从所有Mercurial存储库中删除pyc文件是行不通的.

Hte*_*hno 16

  1. 不要将.pyc文件存储在存储库中.
  2. 使用以下命令自动化.pyc删除:查找.-name'*.pyc'-delete
  3. 在Python中开发使用-B参数.

  • 此外,预编译发行版上的所有.pyc文件.您可以通过标记repo并推送到生产等来进行部署.编译.pyc文件适合那里.对于其他语言,编译二进制文件是太阳下最自然的事情. (3认同)

Ry4*_*ase 9

如何在服务器端使用更新挂钩?把它放在存储库的.hg目录hgrc文件中:

[hooks]
update = find . -name '*.pyc' | xargs rm
Run Code Online (Sandbox Code Playgroud)

每当您在服务器上更新时,这将删除所有.pyc文件.如果你担心重建所有.pyc文件的成本,你总是可以在钩子中更聪明一点,只删除没有.py的.pyc,但这可能有点过分.

  • 找 .-name'*.pyc'-delete (5认同)

Nic*_*ght 6

你需要:

1)真正的部署基础架构,即使它只是一个shell脚本,它可以完成所有任务.从源代码控制克隆/签出更新的副本不是部署策略.

2)任何部署系统都应该完全清理目录结构.我通常的偏好是每个部署都发生在一个名为date + timestamp的新目录中,而一个符号链接(名称如"current")更新为指向新目录.如果出现问题,这会在每台服务器上为您提供面包屑.

3)修复运行Python代码的任何内容.新的.py源文件应始终优先于缓存的.pyc文件.如果这不是您所看到的行为,那就是一个错误,您需要弄清楚它为什么会发生.

  • 对于第3点,它没有发生的原因是因为.py不存在.没有.py存在就没有时间进行比较,而python不会忽略没有.py的pyc. (3认同)

Odd*_*ing 3

我实际上做了什么:

1) 我正在考虑 Nicholas Knight 关于使用正确部署策略的建议。我一直在阅读有关BuildoutCollective.hostout 的内容以了解更多信息。我需要决定这样的重量级策略对于我的项目相对简单的需求是否值得。

2)我在短期内采用了Ry4an的更新挂钩概念,直到我决定为止。

3)我忽略了 Ry4an 关于过度杀伤的警告,并编写了一个 Python 脚本来仅删除杂散的 .pyc 文件。

#!/usr/bin/env python
""" Searches subdirectories of the current directory looking for .pyc files which
    do not have matching .py files, and deletes them.

    This is useful as a hook for version control when Python files are moved.
    It is dangerous for projects that deliberately include Python 
    binaries without source.
"""
import os
import os.path
for root, dirs, files in os.walk("."):
    pyc_files = filter(lambda filename: filename.endswith(".pyc"), files)
    py_files = set(filter(lambda filename: filename.endswith(".py"), files))
    excess_pyc_files = filter(lambda pyc_filename: pyc_filename[:-1] not in py_files, pyc_files)
    for excess_pyc_file in excess_pyc_files:
        full_path = os.path.join(root, excess_pyc_file)
        print "Removing old PYC file:", full_path
        os.remove(full_path)
Run Code Online (Sandbox Code Playgroud)

我的更新挂钩现在调用此命令,而不是其他人建议的“查找”命令。

  • 那会起作用的。如果您愿意,您可以让 udpate 挂钩直接调用 .py 文件的子例程。您只需将其命名为 hook 并提供 .py 文件的路径即可。这将节省你启动整个“另一个 python 虚拟机”的时间。 (2认同)