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

Python开源项目详解

时间:2023-03-12 06:56:26 科技观察

作者以发布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=..join([self.__module__,self.__class__.__name__])FORMAT=%(name)s:%(levelname)s:%(message)slogging.basicConfig(format=FORMAT,level=logging.DEBUG)logger=logging.getLogger(name)returnlogger以日志系统为例:LogMixin类可以在任何其他类中使用第二步:使用打包工具创建setup.py当你的项目有了结构之后,你应该将setup添加到类的根目录项目库.py文件。这有助于所有发布和版本维护过程的自动化。这是一个示例setup.py(源代码:https://github.com/nathan-toubiana/scitime/blob/master/setup.py)。fromsetuptoolsimportsetupfromosimportpathDIR=path.dirname(path.abspath(__file__))INSTALL_PACKAGES=open(path.join(DIR,requirements.txt)).read().splitlines()withopen(path.join(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,版本=0.0.2,url=http://github.com/nathan-toubiana/scitime,author=GabrielLerner&NathanToubiana,author_email=toubiana.nathan@gmail.com,keywords=[机器学习,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文件示例一些注意事项:如果你的包有依赖项,处理它们的一个简单方法是通过配置文件中的install_requires参数添加依赖项(如果列表很长,你可以指向一个requirement.txt文件和以前一样)。如果您希望在任何人安装包时下载元数据(从项目存储库),您应该通过package_data参数添加此元数据。有关setup()函数的更多信息,请参阅:https://setuptools.readthedocs.io/en/latest/setuptools.html注意:步骤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时,这些文件可以根据您的需要为您的描述提供模板。拉取请求创建步骤:https://help.github.com/en/articles/creating-a-pull-request-template-for-your-repository问题创建步骤:https://help.github.com/en/articles/manually-creating-a-single-issue-template-for-your-repository拉取请求模板:https://github.com/nathan-toubiana/scitime/blob/master/.github/PULL_REQUEST_TEMPLATE.md问题模板:https://github.com/nathan-toubiana/scitime/tree/master/.github/ISSUE_TEMPLATE投稿指南(contributionguide)。贡献指南应该简单地说明您希望外部用户如何帮助您改进程序包。Scitime的贡献指南可在以下网址找到:https://github.com/nathan-toubiana/scitime/blob/master/.github/CONTRIBUTING.md。Guidelines,看Scitime的guidelines:https://github.com/nathan-toubiana/scitime/blob/master/.github/CODE_OF_CONDUCT.mdtagsanddescriptions(seebelowscreenshot)tagsinthereadmefile(recommendedahow-toGood关于使用徽章的文章:https://medium.freecodecamp.org/how-to-use-badges-to-stop-feeling-like-a-noob-d4e6600d37d2)。由于自述文件应该相当全面,因此通常会有更详细的文档。您可以使用sphinx来完成,然后管理readthedocs上的文档。与文档相关的文件通常放在docs/文件夹中。sphinx和readthedocs相关教程:https://docs.readthedocs.io/en/stable/intro/getting-started-with-sphinx.html。带有标签和描述的示例项目存储库第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校验(逻辑在flake_diff.sh文件中定义:https://github.com/nathan-toubiana/scitime/blob/master/build_tools/flake_diff.sh)environment:matrix:-PYTHON:"C:\Python36-x64"install:#Wneedwheelinstalledtobuildwheels-"%PYTHON%\python.exe-mpipinstall-requirements.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上创建你的第一个版本——这是为了跟踪项目在给定时间点的状态,每次版本更改时你都需要创建一个新版本。创建步骤:https://help.github.com/en/articles/creating-releases。完成后,唯一剩下要做的就是发布包。分发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步。