0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一步一步教你如何去发布Python项目开源包?

马哥Linux运维 来源:Python开发者 作者:Python开发者 2021-06-10 14:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

注意:本文假设你在 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 文件中定义)

import logging

class LogMixin(object):

@property

def logger(self):

name = ‘。’.join([self.__module__, self.__class__.__name__])

FORMAT = ‘%(name)s:%(levelname)s:%(message)s’

logging.basicConfig(format=FORMAT, level=logging.DEBUG)

logger = logging.getLogger(name)

return logger

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

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

在你的项目有了一套结构之后,你应该在项目库的根目录下添加 setup.py 文件。这有助于所有发布和版本维护过程的自动化。以下是 setup.py 的例子

from setuptools import setup

from os import path

DIR = path.dirname(path.abspath(__file__))

INSTALL_PACKAGES = open(path.join(DIR, ‘requirements.txt’)).read().splitlines()

with open(path.join(DIR, ‘README.md’)) as f:

README = f.read()

setup(

name=‘scitime’,

packages=[‘scitime’],

description=“Training time estimator for scikit-learn algorithms”,

long_description=README,

long_description_content_type=‘text/markdown’,

install_requires=INSTALL_PACKAGES,

version=‘0.0.2’,

url=‘http://github.com/nathan-toubiana/scitime’,

author=‘Gabriel Lerner & Nathan Toubiana’,

author_email=‘toubiana.nathan@gmail.com’,

keywords=[‘machine-learning’, ‘scikit-learn’, ‘training-time’],

tests_require=[

‘pytest’,

‘pytest-cov’,

‘pytest-sugar’

],

package_data={

# include json and pkl files

‘’: [‘*.json’, ‘models/*.pkl’, ‘models/*.json’],

},

include_package_data=True,

python_requires=‘》=3’

setup.py 文件的示例

几点注意事项:

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

如果你希望在任何人安装包时(从项目库中)下载元数据,则应通过 package_data 参数来添加这些元数据。

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

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

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

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

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

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

comment: false

coverage:

status:

project:

default:

target: auto

threshold: 10%

patch:

default:

target: auto

threshold: 10%

.codecov.yml 文件示例

[run]

branch = True

source = scitime

include = */scitime/*

omit =

*/_data.py

*/setup.py

.coveragerc 文件示例

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

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

第 5 步:创建一个合理的文档

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

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

贡献指南(contribution guide)。应该在贡献指南中简单地说明你希望外部用户如何协助你改进这个包。

由于 readme 文件应该相当综合,因此通常会有一个更详细的文档。你可以用 sphinx 来完成,然后在 readthedocs 上管理文档。与文档相关的文件通常放在 docs/文件夹中。

第 6 步:创建持续集成

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

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

codecov 和 readthdocs 也有专用的 webhook

language: python

python:

- “3.6”

# command to install dependencies

install:

- pip install -r requirements.txt

- pip install flake8

- pip install pytest-cov

- pip install codecov

# command to run tests

script:

- python -m pytest --cov=scitime

- 。/build_tools/flake_diff.sh

after_success:

- codecov

.travis.yml 文件的示例:请注意,每次提交,测试都需要与检查测试覆盖率一起进行。但还有一个 flake8 检查

environment:

matrix:

- PYTHON: “C:\Python36-x64”

install:

# We need wheel installed to build wheels

- “%PYTHON%\python.exe -m pip install -r requirements.txt”

- “%PYTHON%\python.exe -m pip install pytest==3.2.1”

build: off

test_script:

- “%PYTHON%\python.exe -m pytest”

appveyor.yml 文件示例:这里我们只运行测试

这将使更新项目库的整个过程更加容易。

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

此时,你即将发布的包应与以下类似:

your_package/

__init__.py

your_module.py

docs/

tests/

setup.py

travis.yml

appveyor.yml

.coveragerc

.codecov.yml

README.md

LICENSE

.github/

CODE_OF_CONDUCT.md

CONTRIBUTING.md

PULL_REQUEST_TEMPLATE.md

ISSUE_TEMPLATE/

现在可以发布了!首先要做的是在 GitHub 上创建你的第一个 release——这是为了在给定的时间点跟踪项目的状态,每次版本更改时都需要创建新的 release。

完成后,唯一要做的就是发布包。发布 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 步。

责任编辑:lq6

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4940

    浏览量

    73119
  • python
    +关注

    关注

    57

    文章

    4856

    浏览量

    89551
  • GitHub
    +关注

    关注

    3

    文章

    484

    浏览量

    18416

原文标题:手把手教你发布 Python 项目开源包

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BlackBerry QNX与众森软件进一步深化战略合作

    今日,深圳市众森软件有限公司(以下简称"众森软件")正式宣布与全球领先的实时操作系统与嵌入式软件供应商 QNX(BlackBerry有限公司旗下部门QNX)进一步深化战略合作。此次合作将进一步推动下代智能网联汽车与智慧出行解决
    的头像 发表于 12-04 16:40 791次阅读

    上汽奥迪与创维汽车智能合作进一步深化升级

    近日,创维汽车智能迎来重要突破:上汽奥迪客户将当前公司开发的显示屏项目沿用至上汽奥迪其他主力车型。这决定不仅体现了客户对创维汽车智能技术实力与服务品质的高度认可,更标志着双方合作进一步深化升级。
    的头像 发表于 11-25 10:32 428次阅读

    淘宝API实时竞品监控,市场策略快人一步

    在当今激烈的电商竞争中,实时掌握竞品动态是企业制胜的关键。淘宝作为中国最大的电商平台,其开放API为商家提供了强大的工具,帮助实现实时竞品监控,从而优化市场策略,抢占先机。本文将一步步解析如何利用
    的头像 发表于 08-06 14:38 533次阅读

    软通动力与中国联通合作关系进一步深化

    近日,软通动力成功中标联通(广东)产业互联网有限公司2025年软件技术开发集中采购项目,中标份额位列榜首。这突破性成果,不仅彰显了软通动力在数字技术服务领域的综合实力,也标志着其与中国联通合作关系的进一步深化。
    的头像 发表于 07-01 09:18 937次阅读

    晶圆级封装:连接密度提升的关键一步

    了解晶圆级封装如何进一步提高芯片的连接密度,为后续技术发展奠定基础。
    的头像 发表于 06-27 16:51 530次阅读

    各位大佬,想问下为什么这个程序一步一步运行就可以读出正确的读数,正常运行却读不出正确读数

    各位大佬,想问下为什么这个程序一步一步运行就可以读出正确的读数,正常运行却读不出正确读数
    发表于 06-23 09:57

    智驾安全,发展到哪一步了?

    智驾安全,发展到哪一步了?
    的头像 发表于 06-10 11:28 526次阅读

    CoT 数据集如何让大模型学会一步一步思考?

    目前,大模型的回答路径基本遵循 input-output 的方式,在面对复杂任务时表现不佳。反之,人类会遵循套有条理的思维流程,逐步推理得出正确答案。这种差异促使人们深入思考:如何才能让大模型“智能涌现”,学会像人类样“一步
    的头像 发表于 04-24 16:51 1035次阅读
    CoT 数据集如何让大模型学会<b class='flag-5'>一步</b><b class='flag-5'>一步</b>思考?

    【迅为电子】一步步教你完成iTOP-RK3568 EDP屏幕适配

    【迅为电子】一步步教你完成iTOP-RK3568 EDP屏幕适配
    的头像 发表于 04-23 15:08 1617次阅读
    【迅为电子】<b class='flag-5'>一步步</b><b class='flag-5'>教你</b>完成iTOP-RK3568 EDP屏幕适配

    医疗设备EMC检测测试整改:保障患者安全的第一步

    深圳南柯电子|医疗设备EMC检测测试整改:保障患者安全的第一步
    的头像 发表于 03-17 11:18 751次阅读
    医疗设备EMC检测测试整改:保障患者安全的第<b class='flag-5'>一步</b>

    ST EDGE AI云服务最后一步无法下载工程是怎么回事?

    ST EDGE AI云服务我选择使用ST提供的模型,使用cube ai 9.0.0,选择STM32板卡。之后就按照文档一步一步操作,基准测试也能运行的到结果(说明云端是生成工程并编译下载到开发板中
    发表于 03-13 08:17

    迅为2K0300开发板进一步刨析,打造HMI体机产品的灵活优势

    迅为2K0300开发板进一步刨析,打造HMI体机产品的灵活优势
    的头像 发表于 02-26 13:58 1024次阅读
    迅为2K0300开发板进<b class='flag-5'>一步</b>刨析,打造HMI<b class='flag-5'>一</b>体机产品的灵活优势

    ADS1115在配置和转换时的具体操作步骤,每一步的寄存器配置是怎样的?

    ADS1115在配置和转换时的具体操作步骤,每一步的寄存器配置是怎样的???希望能给出配置和读取数据的模块函数
    发表于 02-12 08:25

    如果需要将DDC112U设置为非连续模式工作,应该如何一步一步正确地设置芯片?

    或状态8,如果没有CONV的切换发生,是否会直停留在上电时的这个状态?如果需要将DDC112U设置为非连续模式工作,应该如何一步一步正确地设置芯片?
    发表于 01-09 07:43

    沙子变芯片,一步步带你走进高科技的微观世界

    在科技飞速发展的今天,芯片作为现代科技的核心元器件,其制造过程复杂且充满挑战。芯片不仅推动了信息技术、人工智能、物联网等领域的进步,还成为衡量个国家科技实力的重要指标。然而,芯片制造并非易事,从沙子到芯片的每一步都充满了技术、资金和人才的考验。本文将详细解析芯片制造的全
    的头像 发表于 12-19 10:44 1071次阅读
    沙子变芯片,<b class='flag-5'>一步步</b>带你走进高科技的微观世界