APP下载

新手如何释出第一个Python专案开源包?

消息来源:baojiabao.com 作者: 发布时间:2026-05-15

报价宝综合消息新手如何释出第一个Python专案开源包?

好不容易码了个 python 专案,是不是很兴奋?那么怎么把这个专案发出去让大家看到呢?本文作者写了一份在 GitHub 上释出 python 包的简单分步指南。

作者以 SciTime 专案(一个对算法训练时间进行估计的包)的释出为例,详细解释了释出的每个步骤。

注意:本文假设你在 GitHub 上已经有一个想要打包和释出的专案。

第 0 步:获取专案许可证

在做其他事之前,由于你的专案要开源,因此应该有一个许可证。获取哪种许可证取决于专案包的使用方式。开源专案中一些常见许可证有 MIT 或 BSD。

要在专案中新增许可证,只需参照以下连结中的步骤,将 LICENSE 档案新增到专案库中的根目录即可:https://help.github.com/en/articles/adding-a-license-to-a-repository

第 1 步:让你的程式码准备就绪

要将专案进行打包,你需要做一些预备工作:

让你的专案结构正确就位。通常情况下,专案库的根目录包含一个以专案名称命名的资料夹,专案的核心程式码应该位于此资料夹中。在这个资料夹之外是执行和构建包(测试、文件等)所需的其他程式码。

核心资料夹应包括一个(或多个)模组和一个 __init__.py 档案,该档案包含你希望让终端使用者访问的类/函式。此档案还可以包含包的版本,以便于终端使用者访问。

理想情况下,应使用 logging 包来设定合理的日志记录系统(而不是用 prints 输出)。

理想情况下,应将你的核心程式码分配到一个或多个类中。

from .estimate import Estimator

以__init__.py 为例,如果 Estimator 是终端使用者将会访问的类(该类在 estimate.py 档案中定义)

以日志系统为例:LogMixin 类可以在其他任何类中使用

第 2 步: 使用打包工具建立 setup.py

在你的专案有了一套结构之后,你应该在专案库的根目录下新增 setup.py 档案。这有助于所有释出和版本维护过程的自动化。以下是 setup.py 的例子(源代码:https://github.com/nathan-toubiana/scitime/blob/master/setup.py)。

setup.py 档案的示例

几点注意事项:

如果你的包有依赖项,处理这些依赖项的简单方法是在配置档案中通过 install_requires 引数来新增依赖项(如果列表很长,你可以像之前那样指向一个 requirement.txt 档案)。

如果你希望在任何人安装包时(从专案库中)下载元资料,则应通过 package_data 引数来新增这些元资料。

有关 setup() 函式的更多资讯,请参见:https://setuptools.readthedocs.io/en/latest/setuptools.html

注意:第 3 步到第 6 步是可选的(但强烈推荐),但是如果你现在马上想释出你的包,可以直接跳到第 7 步。

第 3 步:设定本地测试和检查测试覆盖率

此时还没有完成,你的专案还应该有单元测试。尽管有许多框架能帮助你做到,但一种简单的方法是使用 pytest。所有测试都应该放在一个专用的资料夹中(例如名为 tests/或 testing 的资料夹)。在这个资料夹中放置你需要的所有测试档案,以便尽可能多地包含你的核心程式码。下面是一个如何编写单元测试的示例。这里还有一个 SciTime 的测试档案。

一旦就位,你就可以通过在专案库的根目录执行 python -m pytest 在本地进行测试。

建立测试后,你还应该能估算覆盖率。这一点很重要,因为你希望尽可能多地测试专案中的程式码量(以减少意外的 bug)。

很多框架也可以用于计算覆盖率,对于 SciTime,我们使用了 codecov。你可以通过建立.codecov.yml 档案来决定允许的最小覆盖率阈值,还可以通过建立.coveragerc 档案来决定要在覆盖率分析中包含哪些档案。

.codecov.yml 档案示例

.coveragerc 档案示例

第 4 步:标准化语法和程式码风格

你还需要确保你的程式码遵循 PEP8 准则(即具有标准样式并且语法正确)。同样,有很多工具可以帮助你解决。这里我们用了 flake8。

第 5 步:建立一个合理的文件

现在你的专案已经测试过了,结构也很好了,是时候新增一个合理的文件。首先是要有一个好的 readme 档案,它会在你的 Github 专案库的根目录上显示。完成后,加上以下几点会更好:

Pull 请求和 issue 模板:当建立新的 Pull 请求或 issue 时,这些档案可以根据你的需求给你的描述提供模板。

Pull 请求建立步骤:https://help.github.com/en/articles/creating-a-pull-request-template-for-your-repository

issue 建立步骤:https://help.github.com/en/articles/manually-creating-a-single-issue-template-for-your-repository

Pull 请求模板:https://github.com/nathan-toubiana/scitime/blob/master/.github/PULL_REQUEST_TEMPLATE.md

issue 模板:https://github.com/nathan-toubiana/scitime/tree/master/.github/ISSUE_TEMPLATE

贡献指南(contribution guide)。应该在贡献指南中简单地说明你希望外部使用者如何协助你改进这个包。Scitime 的贡献指南参见:https://github.com/nathan-toubiana/scitime/blob/master/.github/CONTRIBUTING.md。

准则,Scitime 的准则参见:https://github.com/nathan-toubiana/scitime/blob/master/.github/CODE_OF_CONDUCT.md

标签和说明(见下面的截图)

readme 档案中的标签(推荐一篇如何使用标签的好文章:https://medium.freecodecamp.org/how-to-use-badges-to-stop-feeling-like-a-noob-d4e6600d37d2)。

由于 readme 档案应该相当综合,因此通常会有一个更详细的文件。你可以用 sphinx 来完成,然后在 readthedocs 上管理文件。与文件相关的档案通常放在 docs/资料夹中。sphinx 和 readthedocs 相关教程:https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html。

包含标签和说明的专案库示例

第 6 步:建立持续整合

此时,你的专案离释出就绪不远了。但是,在每次提交之后,必须更新文件、执行测试以及检查样式和覆盖率似乎有点难以应付。幸运的是,持续整合(CI)可以帮助你完成。你可以在每次提交之后使用 GitHub 的 webhook 来自动执行所有的这些操作。以下是我们在 SciTime 中使用的一套 CI 工具:

对于执行测试,我们使用了 travis ci 和 appveyor(用于 Windows 平台上的测试)。对于 Travis CI,除了在专案库上设定 webhook 之外,你还必须建立一个.travis.yml 档案,在该档案中,你不仅可以执行测试,还可以上传更新的覆盖率输出以及检查样式和格式。通过建立 appveyor.yml 档案,appveyor 也可以这样做。

codecov 和 readthdocs 也有专用的 webhook

.travis.yml 档案的示例:请注意,每次提交,测试都需要与检查测试覆盖率一起进行。但还有一个 flake8 检查(逻辑则在 flake_diff.sh 档案中定义:https://github.com/nathan-toubiana/scitime/blob/master/build_tools/flake_diff.sh)

appveyor.yml 档案示例:这里我们只执行测试

这将使更新专案库的整个过程更加容易。

整合 webhook 的提交历史记录示例

第 7 步:建立你的第一个 release 和 publication

此时,你即将释出的包应与以下类似:

现在可以释出了!首先要做的是在 GitHub 上建立你的第一个 release——这是为了在给定的时间点跟踪专案的状态,每次版本更改时都需要建立新的 release。建立步骤:https://help.github.com/en/articles/creating-releases。

完成后,唯一要做的就是释出包。释出 python 包最常见的平台是 PyPI 和 Conda。以下我们将描述如何用两者释出:

对于 PyPI,首先需要建立一个账户,然后用 twine 执行一些步骤:https://realpython.com/pypi-publish-python-package/。这应该相当简单,而且 Pypi 还提供了一个可以在实际部署之前使用的测试环境。PyPI 总体上包括建立源代码(python setup.py sdist)并使用 twine(twine upload dist/*)来上传。完成后,应该有一个与你的包对应的 PyPI 页面,并且任何人都应该能够通过执行 pip 命令来安装你的包。

对于 Conda,我们推荐通过 conda forge 来发布你的包,conda forge 是一个社群,帮助你通过 conda 渠道释出和维护包。你可以按照以下步骤将包新增到社群:https://conda-forge.org/#add_recipe,然后你会被新增到 conda forge Github 组织中,并能够非常轻松地维护你的包,然后任何人都可以通过执行 conda 命令来安装你的包。

完成!

现在,你的包应该已经发出去,并且任何人都可以使用了!虽然大部分工作都完成了,但是你仍然需要维护你的专案,你需要进行一些更新:这大体上意味着每次进行重大更改时都要更改版本,建立新的 release,并再次执行第 7 步。

原文:https://medium.freecodecamp.org/from-a-python-project-to-an-open-source-package-an-a-to-z-guide-c34cb7139a22

2020-01-19 06:48:00

相关文章