在我的Python项目中使用自定义包

6 投票
6 回答
1534 浏览
提问于 2025-04-16 06:22

我现在正在做几个Python项目,想弄清楚如何使用自己修改过的开源包。

比如,我在用tipfy和zc.buildout,并且添加了一个'paypal'包。可惜的是,这个包没有我需要的功能,所以我在github上把它复制了一份,并添加了这个功能。我会给原来的包维护者发一个请求,希望他们能接受我的修改。但是,不管他们是否接受,我都想用我自己的版本,同时又希望zc.buildout能帮我管理依赖关系。我该怎么做呢?

我是不是应该把我修改后的库上传到PyPI,并在前面加上我的名字?这样做会不会让索引变得混乱?

还是说我应该自己建立和维护一个索引和包的仓库?我该在哪里找到这个格式呢?而且,按照开源软件的许可证,我能否把修改过的包放在自己的仓库里,名字不变?(我不想在项目的每个文件里都改成新的命名空间)

我相信这个问题经常出现,不仅仅是在Python中。我觉得在Maven和SBT中也会有类似的情况……人们通常是怎么处理想用自己版本的流行包的呢?

6 个回答

2

我已经有一段时间没用buildout了,但如果我没记错的话,它有一个pip的配方,可以让你使用pip的需求文件。你可以创建一个需求文件,里面可以写一些这样的内容:

-e git+http://<github url>

这样在安装的时候,它会在本地检查这个包。

2

为了让你少点头疼,我建议把所有这些自定义代码都打包在你的项目里。比如,你对某个package进行了修改。如果这个包的许可证允许这样做,那就把你修改过的package和你的代码放在一起,就像放在一个普通的文件夹里一样。你可以把它放在package文件夹下面,这样就容易找到。等到package的开发者修复了你需要的功能后,你只需删除这个文件夹,然后再把它作为一个在线包的依赖项。

这种做法的一个额外好处是,可以让你分发给用户或客户时更方便。

6

有两种方法可以解决这个问题。我会根据具体情况选择使用其中一种:

  1. 使用 mr.developer 来从版本控制系统中包含软件包(mr.developer 支持多种系统,包括 git)。我在开发时会用这个。

  2. 建立一个私有的软件包仓库。用 Apache 做一个简单的目录列表就可以了。然后把你私有仓库的 URL 加入到 find-links 里:

    [buildout]
    ...
    find-links =
        ...
        http://username:password@dist.example.com/projectname
    

    在这个例子中,我还包括了用户名和密码(这样 buildout 就会进行身份验证),以及一个特定于项目的服务器路径。当然,你也可以为所有项目建立一个大的私有仓库。

    在这个仓库里,你可以放完整的软件包,或者只是软件包的压缩文件。find-links 中列出的仓库会在 PyPI 之前被搜索。

    我用这种方法来进行部署构建。这样软件就会使用已发布的软件包,这样发布管理会更清晰、更简单。

托管你自己修改过的开源软件包是完全可以的!这就是使用开源软件时你所拥有的自由之一。需要注意的是,当你像这样修改 GPL 代码并分发给第三方时,你需要把你的修改提供给他们。建立一个软件包仓库就是遵守这一点的一种方式。

撰写回答