当前位置: 首页 > 科技观察

教大家如何发布Python项目的开源包

时间:2023-03-18 13:13:38 科技观察

终于完成了一个python项目,是不是很激动?那么这个项目怎么发出去给大家看呢?本文作者编写了一个简单的分步指南,用于在GitHub上发布python包。以SciTime项目(估计算法训练时间的包)的发布为例,作者详细讲解了发布的每一步。注意:本文假设您在GitHub上已经有一个项目要打包发布。第0步:获得项目许可证首先,由于您的项目将是开源的,因此它应该具有许可证。获得哪种许可证取决于项目包的使用方式。开源项目中一些常见的许可证是MIT或BSD。要向项目添加许可证,只需按照链接中的步骤将许可证文件添加到项目存储库的根目录:https://help.github.com/en/articles/adding-a-license-to-a-repository第1步:准备好您的代码要打包您的项目,您需要做一些准备工作:准备好您的项目结构。通常情况下,项目仓库的根目录下会有一个以项目名称命名的文件夹,项目的核心代码应该位于这个文件夹中。此文件夹之外是运行和构建包所需的其他代码(测试、文档等)。核心文件夹应该包括一个(或多个)模块和一个__init__.py文件,其中包含您希望最终用户可以访问的类/函数。该文件还可以包含便于最终用户访问的包版本。理想情况下,应该使用logging包来设置合理的日志系统(而不是使用prints输出)。理想情况下,您的核心代码应分为一个或多个类。from.estimateimportEstimator以__init__.py为例,如果Estimator是最终用户会访问的类(这个类定义在estimate.py文件中)importloggingclassLogMixin(object):@propertydeflogger(self):name='.'。加入([self.__module__,self.__class__.__name__])FORMAT='%(name)s:%(levelname)s:%(message)s'logging.basicConfig(format=FORMAT,level=logging.DEBUG)logger=logging.getLogger(name)returnlogger以日志系统为例:LogMixin类可以在任何其他类中使用第二步:使用打包工具创建setup.py当你的项目有了结构之后,你应该将它添加到项目库根目录下添加setup.py文件。这有助于所有发布和版本维护过程的自动化。下面是setup.pyfromsetuptoolsimportsetupfromosimportpathDIR=path.dirname(path.abspath(__file__))INSTALL_PACKAGES=open(path.join(DIR,'requirements.txt')).read().splitlines()withopen(path.加入(DIR,'README.md'))asf:README=f.read()setup(name='scitime',packages=['scitime'],description="Trainingtimeestimatorforscikit-learnalgorithms",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='GabrielLerner&NathanToubiana',author_email='toubiana.nathan@gmail.com',keywords=['machine-learning','scikit-learn','training-time'],tests_require=['pytest','pytest-cov','pytest-sugar'],package_data={#includejsonandpklfiles'':['*.json','models/*.pkl','models/*.json'],},include_package_data=True,python_requires='>=3')setup.py文件示例要知道:如果你的包有依赖项,处理它们的一个简单方法是通过th在配置文件中添加它们einstall_requires参数(如果列表很长,您可以像以前一样指向requirement.txt文件)。如果您希望在任何人安装包时下载元数据(从项目存储库),您应该通过package_data参数添加此元数据。注意:第3步到第6步是可选的(但强烈推荐),但如果你想立即发布你的包,你可以直接跳到第7步。第3步:设置本地测试和检查测试覆盖率此时未完成,你的项目也应该有单元测试。虽然有许多框架可以帮助您做到这一点,但一种简单的方法是使用pytest。所有测试都应放在专用文件夹中(例如名为tests/或testing的文件夹)。将您需要的所有测试文件放在该文件夹中,以尽可能多地包含您的核心代码。下面是如何编写单元测试的示例。这也是SciTime的测试文件。安装到位后,您可以通过在项目存储库的根目录下运行python-mpytest来在本地对其进行测试。创建测试后,您还应该能够估计覆盖率。这很重要,因为您希望尽可能多地测试项目中的代码量(以减少意外错误)。许多框架也可用于计算覆盖率,对于SciTime,我们使用了codecov。您可以通过创建.codecov.yml文件来决定允许的最小覆盖率阈值,并且可以通过创建.coveragerc文件来决定将哪些文件包含在覆盖率分析中。comment:falsecoverage:status:project:default:target:autothreshold:10%patch:default:target:autothreshold:10%.codecov.yml文件示例[run]branch=Truesource=scitimeinclude=*/scitime/*omit=*/_data.py*/setup.py.coveragerc文件示例第4步:标准化语法和代码风格您还需要确保您的代码遵循PEP8准则(即具有标准风格且语法正确)。同样,有很多工具可以帮助您。这里我们使用flake8。第5步:创建合理的文档现在您的项目已经过测试并且结构良好,是时候添加一个合理的文档了。首先是要有一个好的readme文件,它会显示在你的Github项目仓库的根目录下。完成后,最好添加以下内容:Pullrequest和issue模板:在创建新的pullrequest或issue时,这些文件可以根据您的需要为您的描述提供模板。投稿指南。贡献指南应该简单地说明您希望外部用户如何帮助您改进程序包。由于自述文件应该相当全面,因此通常会有更详细的文档。您可以使用sphinx来完成,然后管理readthedocs上的文档。与文档相关的文件通常放在docs/文件夹中。带有标签和描述的示例项目存储库第6步:创建持续集成此时,您的项目离发布就绪不远了。然而,每次提交后都必须更新文档、运行测试以及检查样式和覆盖范围似乎有点让人不知所措。幸运的是,持续集成(CI)可以帮助您做到这一点。您可以使用GitHub的网络挂钩在每次提交后自动执行所有这些操作。这是我们在SciTime中使用的一组CI工具:为了运行测试,我们使用了travisci和appveyor(用于Windows平台上的测试)。对于TravisCI,除了在项目存储库上设置webhook之外,您还必须创建一个.travis.yml文件,您不仅可以在其中运行测试,还可以上传更新的覆盖率输出并检查样式和格式。Appveyor可以通过创建一个appveyor.yml文件来做同样的事情。codecov和readthdocs也有专门的webhook语言:pythonpython:-"3.6"#commandtoinstalldependenciesinstall:-pipinstall-rrequirements.txt-pipinstallflake8-pipinstallpytest-cov-pipinstallcodecov#commandtoruntestsscript:-python.mpytest--cov=scitime-./build_dols的例子shaker_success:-codecov.travis.yml文件:请注意,对于每次提交,都需要运行测试并检查测试覆盖率。但是还有一个flake8检查环境:matrix:-PYTHON:"C:\\Python36-x64"install:#Weneedwheelinstalledtobuildwheels-"%PYTHON%\\python.exe-mpipinstall-rrequirements.txt"-"%PYTHON%\\python.exe-mpipinstallpytest==3.2.1"build:offtest_script:-"%PYTHON%\\python.exe-mpytest"示例appveyor.yml文件:这里我们只运行测试这将使更新项目库的整个过程更轻松。带有集成webhook的提交历史示例第7步:创建您的第一个版本和出版物此时,您即将发布的包应该如下所示:your_package/__init__.pyyour_module.pydocs/tests/setup.pytravis.ymlappveyor.yml.coveragerc.codecov.ymlREADME.mdLICENSE.github/CODE_OF_CONDUCT.mdCONTRIBUTING.mdPULL_REQUEST_TEMPLATE.mdISSUE_TEMPLATE/现在可以发布了!首先要做的是在GitHub上创建你的第一个版本——这是为了跟踪项目在给定时间点的状态,每次版本更改时你都需要创建一个新版本。完成后,唯一剩下要做的就是发布包。分发python包的最常见平台是PyPI和Conda。下面我们将介绍如何使用两者进行发布:对于PyPI,首先您需要创建一个帐户,然后使用twine执行一些步骤:https://realpython.com/pypi-publish-python-package/。这应该是相当简单的,而且Pypi还提供了一个测试环境,可以在实际部署之前使用。PyPI通常涉及创建源代码(pythonsetup.pysdist)并使用twine上传它(twineuploaddist/*)。完成后,您的包应该有一个PyPI页面,任何人都应该能够通过运行pip命令来安装您的包。对于Conda,我们建议通过condaforge分发您的包,condaforge是一个帮助您通过conda渠道发布和维护包的社区。您可以按照以下步骤将包添加到社区:https://conda-forge.org/#add_recipe,然后您将被添加到condaforgeGithub组织中,并且能够非常轻松地维护您的包,然后任何人都可以您可以通过运行conda命令来安装你的包。结束!您的包裹现在应该已发货并可供任何人使用!虽然大部分工作已完成,但您仍然需要维护您的项目,并且需要进行一些更新:这基本上意味着每次进行重大更改时都要更改版本,创建新版本,然后再次执行第7步。