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

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

注意:本文假设你在 GitHub 上已经有一个想要打包和发布的项目。

第 0 步:获取项目许可证

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

第 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 的例子(源代码:https://github.com/nathan-toubiana/scitime/blob/master/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 文件来决定要在覆盖率分析中包含哪些文件。

.codecov.yml 文件示例

comment: false

coverage:

status:

project:

default:

target: auto

threshold: 10%

patch:

default:

target: auto

threshold: 10%

.coveragerc 文件示例

[run]

branch = True

source = scitime

include = */scitime/*

omit =

*/_data.py

*/setup.py

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

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

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

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

由于 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

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 检查(逻辑则在 flake_diff.sh 文件中定义:https://github.com/nathan-toubiana/scitime/blob/master/build_tools/flake_diff.sh)

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 文件示例:这里我们只运行测试

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

集成 webhook 的提交历史记录示例

第 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。创建步骤: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 步。

python如何创建工程预设_新手如何发布第一个 Python 项目开源包?相关推荐

  1. python如何创建工程预设_如何在sublime3项目设置中设置python模块的搜索路径?ImportError: No module named *的解决办法...

    问题:之前使用pycharm,用的挺溜,但是电脑配置实在不争气,pycharm启动久了,耗去大量内存,导致运行起来越来越慢,于是转向使用sublime text. 把项目从pycharm切换到subl ...

  2. python自学入门12周_新手怎么100天入门Python?

    作为目前最火也是最实用的编程语言,Python 不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求 list 的必要一条. 但学 Python 这件事情,你可能和大多数人一样,下了一百次决 ...

  3. python自动化测试实战pdf无涯_【独家发布】Selenium2 Python自动化测试实战 第二版...

    Selenium2 Python自动化测试实战 第二版 第1 章自动化测试基础............................................................. ...

  4. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  5. 如何系统地自学python100天_Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅...

    北京千锋互联科技有限公司成都分公司骆昊(jackfrued)在Github上发布了一个Python学习秘笈,从萌新到王者的100天Python学习之旅. 简单的说,Python是一个"优雅& ...

  6. 安装的python没有菜单栏_新手求助 为什么mac安装python后打开idle没有工具栏?

    查看: 6662|回复: 10 [已解决]新手求助 为什么mac安装python后打开idle没有工具栏? 电梯直达 发表于 2016-9-26 11:09:35 | 只看该作者 |倒序浏览 |阅读模 ...

  7. 基于STM32+使用标准库创建工程--手把手纯新手教学

    前言         这个博客的意义就是为了帮助新手快速创建一个基于STM32的工程模板,主要记录从零创建一个全新的STM32F103的项目过程,大部分是自己收集和整理,如有侵权请联系我删除. 本博客 ...

  8. vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...

    一.课程介绍: 从7系列FPGA开始,Xilinx提出了Vivado Design Suite设计软件,提供全新构建的SoC 增强型.以 IP 和系统为中心的下一代开发环境,以解决系统级集成和实现的生 ...

  9. 复制的python代码格式错误_新手常见6种的python报错及解决方法

    此篇文章整理新手编写代码常见的一些错误,有些错误是粗心的错误,但对于新手而已,会折腾很长时间才搞定,所以在此总结下我遇到的一些问题.希望帮助到刚入门的朋友们. 1.NameError变量名错误 报错: ...

  10. python创建虚拟环境打包_用虚拟环境保存库文件--Python打包-阿里云开发者社区

    用虚拟环境保存库文件 如果你同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你担心已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而 治之. ...

最新文章

  1. java类安卓app 简介_android.app.Activity 的介绍
  2. 一个计算机高手的成长(转)
  3. luogu1341 无序字母对
  4. Sentinel(十六)之AHAS Sentinel 控制台
  5. pat1100. Mars Numbers (20)
  6. 下载keep运动软件_Keep运动软件官网下载_Keep运动最新官网下载_18183软件下载
  7. 工作中的沟通及信息传递
  8. “八戒”马德华自传《悟能》首发《西游记》师徒五人再聚首
  9. python post请求参数化,参数化包含JSON主体的python POST请求
  10. matebook14装鸿蒙系统,matebook14几个接口
  11. JavaScript语言精粹(修订版)
  12. 5G网络架构、网络接口及协议栈
  13. 基于单片机的空气质量监测系统设计
  14. 如何卸载Windows预安装内置应用
  15. ENVI学习总结(三)——图像几何校正
  16. 十分钟开发出神经网络五子棋(三)
  17. ForkJoinPool的使用及基本原理
  18. python排名上升_TIOBE 9月排名: C ++下降,Python夺得第三名
  19. 一个优秀IT专家的成长历程---献给所有的颓废或即将颓废的人们(ZZ)
  20. 什么叫磁场强度、磁通势、磁阻、导磁率、电磁力、涡流?

热门文章

  1. 电脑硬件知识大扫盲:主板知识大全
  2. 比Google Map更加清晰的网络地图——RealBird
  3. 剑指_5替换空格(Python)
  4. matlab信号建模,Matlab在信号处理中的建模仿真
  5. python实现自动打电话软件_python拨打电话
  6. IDEA安装mysql程序包,程序包的下载!以及程序包配置到项目详解(更适合英语小白)
  7. 2016重庆大学计算机学院复试分数线,重庆大学2016考研复试分数线(已公布)
  8. C语言程序设计课题分析,C语言程序设计综合实践性教学课题报告.doc
  9. python向oracle写数据类型,python-oracle插入数据类型不匹配
  10. Zabbix(四):高级应用之--宏、网络发现测试实例