Python 有没有优雅的修改使用第三方库的办法?

2022-09-27 20:42:10 +08:00
 ggp1ot2

大概是这样。

比如我现在项目 A ,用到了 B ,C 两个库。

但是这两个库的部分功能我不满意,因此我去 site-packages 文件夹下找到这俩库的目录,并修改了这辆库的部分文件。

但是这样的话,每次我要想在另外一台机器上部署这个项目,我需要先创建虚拟环境,然后复制拉取项目 A 的全部内容,然后进入到该虚拟环境下,找到库 B 、C 的目录,替换掉我修改的文件,才能成功运行。

这样有点太麻烦了,每次修改,不仅要打包项目文件,还要把 B 、C 库给找到且打包了。

有没有一种办法,可以更优雅一点?

例如,是否可以在项目 A 下,把 B 、C 库直接加进去,然后直接在这里面的 B 、C 所在的文件夹下修改,这样我只需要保存项目 A 一个文件夹就可以了。

另外一个需要说明的是,我不是直接使用了 B 、C 两个库,即不是直接 import B xxxx ,这两个库是另外几个库所依赖的。。。

总感觉我这样,每次特别蠢。。。

3061 次点击
所在节点    程序员
23 条回复
ysc3839
2022-09-27 20:49:51 +08:00
改代码,生成 wheel 文件,然后在虚拟环境下安装 wheel
zmxnv123
2022-09-27 20:51:06 +08:00
试试猴子补丁的思想?
hsfzxjy
2022-09-27 20:59:52 +08:00
建议猴子补丁
westoy
2022-09-27 21:09:11 +08:00
fork 自己维护

monkey patch 万一碰到不守武德在小版本做特性破坏式更新的, 那就故事变事故了
ggp1ot2
2022-09-27 21:17:36 +08:00
@westoy #4 理论上我永远停在这个版本,不更新应该没有问题吧
Jirajine
2022-09-27 21:30:27 +08:00
把那两个库 vendor 到自己的项目里
lambdaq
2022-09-27 22:20:50 +08:00
小修小改的话直接 hack 啊,比如 sentry 的库限制了 500 字符,我就直接 import 那个然后给改掉

我经常这样干。不如你把库帖出来
Cooky
2022-09-27 22:26:01 +08:00
自己建个库 E 把 B C 包装一下
crysislinux
2022-09-27 23:27:40 +08:00
这时候知道 npm 的好了吧。。monkey patch 不要太容易。
crab
2022-09-27 23:35:07 +08:00
fork 一份,指定安装。
ClericPy
2022-09-28 00:02:11 +08:00
都提了猴子补丁, 这也是用了有 bug 第三方库时候垂死抢救的最简单途径...

前面提到破坏式更新会导致猴子补丁失效, 可以考虑通过开闭原则实现个适配器之类的方式, 如果必须要侵入式魔改, 那就冻结版本吧...
c0xt30a
2022-09-28 01:14:22 +08:00
自己 fork 一份,然后用 pip 之类的指定位置安装。只要能保证先安装了 B 跟 C ,然后再安装你 fork 的那份就可以了。pip 这个包管理器似乎对覆盖已经存在的文件或者软件包并不在意。
c0xt30a
2022-09-28 01:15:53 +08:00
另外的办法是做个 patch ,每次自动构建的时候在 pipline 里自动 patch B 跟 C 。

意见仅供参考。
ruanimal
2022-09-28 09:49:46 +08:00
简单点的方法就是把修改过的版本复制到项目的根目录
ggp1ot2
2022-09-28 09:54:48 +08:00
@ruanimal #14 但是每次修改一点,就要弄好几个文件夹,感觉特别麻烦
ruanimal
2022-09-28 09:57:24 +08:00
@ggp1ot2 那么你应该思考一下了,是不是用法不对,基本没有需要频繁修改三方库的场景。

或者举个具体的例子看看
fkdtz
2022-09-28 10:00:12 +08:00
1. 自己继承并重写部分方法
2. fork 自己的仓库版本
3. 元编程
killva4624
2022-09-28 10:06:27 +08:00
import 相关对象修改,然后当成一个公共库使用。
1018ji
2022-09-28 10:20:30 +08:00
@lambdaq sentry 咋改 求教
SoulMelody
2022-09-28 10:22:14 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/883364

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX