python - 如何管理项目中的修补库?
问题描述
语境
在我的 python 项目中,我使用来自不同库的代码。有时我会遇到一个库,它可以完成我想要的 99% 的工作,而我自己添加的另外 1% 是“修补”库。
但是,这些补丁没有存储在我项目的 git 存储库中。因此,当我在其他地方克隆项目并安装要求时,我需要再次手动修补已安装的库。
例子
exif_delete包从图像中删除 EXIF 数据。这很棒。但是,它也删除了方向标签,这意味着图像可能以不正确的方向显示(例如,纵向图像显示在其侧面)。
这可以通过在删除所有 EXIF 数据之前旋转图像来解决。为此,我在我的机器上添加了以下内容:
- 在exif_delete.py 的第 26 行:
from PIL import ImageOps
- 在exif_delete.py 的第 108 行:
original = ImageOps.exif_transpose(original)
问题
如何以稳健的方式将我在上面示例中完成的补丁转移到另一台机器上?
解决方案
正如每个人所说,与包维护者合作来解决问题要好得多。但是,如果您需要让事情更快地工作,但又不想修改包,您可以随时从自己的代码中修改函数。
由于这是一个__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 中的任何内容,但不要滥用它,否则您会感到困惑,也不要发布任何这样的补丁,否则您会让人讨厌您的代码。
推荐阅读
- python - Discord.py send() 接受 1 到 2 个位置参数
- c - 完成 atoi 令牌后,我不能制作 strcpy 吗?
- reactjs - 平台 "win32" 与此模块 (fsevents) 不兼容
- mysql - MySQL 在 my.cnf 文件中设置 innodb_buffer_pool_size - 未找到
- mongodb - 仅当文档不存在时如何将文档添加到 mongo
- css - 如何使用 _app.js (Next.js) 中声明的全局 css 文件中的 css 类
- python - 如何将 Python 脚本添加到 HTML
- php - 如何使用 php 在邮件中提交联系表格?
- python - 腌制数据类的实例
- java - Docker MySQL在超时后丢弃表:连接关闭后不允许操作