首页 > 解决方案 > 如何管理项目中的修补库?

问题描述

语境

在我的 python 项目中,我使用来自不同库的代码。有时我会遇到一个库,它可以完成我想要的 99% 的工作,而我自己添加的另外 1% 是“修补”库。

但是,这些补丁没有存储在我项目的 git 存储库中。因此,当我在其他地方克隆项目并安装要求时,我需要再次手动修补已安装的库。

例子

exif_delete包从图像删除 EXIF 数据。这很棒。但是,它也删除了方向标签,这意味着图像可能以不正确的方向显示(例如,纵向图像显示在其侧面)。
这可以通过在删除所有 EXIF 数据之前旋转图像来解决。为此,我在我的机器上添加了以下内容:

问题

如何以稳健的方式将我在上面示例中完成的补丁转移到另一台机器上?

标签: python

解决方案


正如每个人所说,与包维护者合作来解决问题要好得多。但是,如果您需要让事情更快地工作,但又不想修改包,您可以随时从自己的代码中修改函数。

由于这是一个__main__程序,因此您需要一个新的主入口点。在这种情况下,应该可以执行以下操作(包括检查代码是否未更改):

import exif_delete

def my_new_exif_delete(original_file_path, new_file_path):
    # Whatever you want it to do

import inspect
import hashlib

# Possibly over-the-top check that the original code has not changed
expected = '60cea7e2226b9eb4ab2d6a7f1353110d'  # Update to proper md5sum for exif_delete.exif_delete
found = hashlib.md5(inspect.getsource(exif_delete.exif_delete).encode())
if found != expected:
    raise Exception('code appears to have changed--patching aborted')

# Replace exif_delete with one you prefer
exif_delete.exif_delete = my_new_exif_delete

if __name__ == '__main__':
    exif_delete.main()

请记住,您可以在运行时更改Python 中的任何内容,但不要滥用它,否则您会感到困惑,也不要发布任何这样的补丁,否则您会让人讨厌您的代码。


推荐阅读