每个软件开发员和数据科学家都难免要做程序包。本文推荐一篇Python开源程序包的制作指南,希望这个包含了具体操作步骤的指南能让你在构建程序包时不用花那么多耐心和时间。(适用于macOS系统的Python3。7版本) 尝试着自己去构建美丽的东西吧! 第1步:制定计划 我们的最终目的是制作一个很简单的Python库,它能够让用户轻松地将Jupyter笔记本转换为HTML文件或Python脚本。 程序包的第一个迭代可以让用户调用print语句的函数。 既然我们已经知道想做什么了,接下来要给包命名。 第2步:命名 命名并不简单。名字要取得独特,简短且好记,要全部都是小写字母,绝对不能有破折号或其他标点符号,下划线也不行。给包命名的时候,还需要在GitHub,Google和PyPI上确认这个名字是否可用。 如果你对包期望很高,希望在某一天它在GitHub上会有10000颗星星,那你还得确认这个名字是否能用于社交网络。在本文的示例中,我们把包命名为notebookc,因为它能用于各种平台,简短而且有描述意义。 第3步:检查配置 确保你安装配置了Python3。7,GitHub和Homebrew。需要的话,可以在下面下载: Python 下载安装Python3。7:https:www。python。orgdownloads GitHub 免费注册GitHub账户:https:github。comjoin 安装Git:https:help。github。comarticlessetupgit Homebrew Homebrew是Mac系统特有的程序包管理器。(安装说明:https:brew。sh)。 Venv 如果使用的是Python3。6版本,建议用venv来创建虚拟环境以构建程序包。用Python来管理虚拟环境的方法很多,可遵循的建议也有很多。 从Python3。3版本起,Python就自带venv了,但要注意,从Python3。4的版本开始,venv才能在虚拟环境中安装pip和setuptools。 用下列命令在Python3。7中创建虚拟环境: python3。7mvenvmyenv 用你喜欢的名字替换myenv,激活虚拟环境: sourcemyenvbinactivate 现在可以在终端提示的最左端看到(myenv),或者看到你给虚拟环境取的名字。 完成之后,使用deactivate停用虚拟环境。 之后,在GitHub上进行设置。 第4步:在GitHub上创建组织 GitHub在版本控制注册上是市场领导者,其他的包括GitLab和Bitbucket也很受欢迎。本指南中我们是用GitHub。 按照提示,在GitHub上创建一个新组织。我们将组织命名为notebooktoall。你可以在个人帐户下创建知识库(repository),但我们的目标之一是学习如何为更大的群体创建一个开源项目。 第5步:创建GitHub知识库 创建一个新的知识库。 从下拉列表中添加gitignore,为你的知识库选择Python。gitignore文件的内容与要从Git知识库中剔除的文件夹和文件类型相匹配。你可以之后再修改gitignore以剔除其他不必要或敏感的文件。 建议从下拉列表的添加许可证(Addalicense)中选择一个许可证,它决定了使用知识库内容的用户能做什么。一些许可证会比较宽松,如果没有选择许可证,系统会采用默认的版权法。 本文的项目选的是通用公共许可证v3。0(GeneralPublicLicensv3。0),因为它用的广泛,而且可以保证终端用户运行、学习、共享和修改软件的自由来自维基百科。 第6步:复制和添加目录 选择要在本地复制知识库的位置,然后按下面的说明运行: 复制githttps:github。comnotebooktoallnotebookc。git 替代组织和知识库。 使用桌面图形用户界面(GUI)或代码编辑器进入项目文件夹,或者用cdmyproject的命令行进入项目文件夹,然后用lsA查看文件。初始文件夹和文件如下:。git 。gitignore LICENSE README。rst 为主项目文件创建一个子文件夹,建议子文件夹的命名与程序包的相同,并确认名称不包含空格。 在子文件夹中创建一个名为init。py的文件,这个文件可以先空着。将文件导入到子文件夹时,这个文件是必需的。 创建另一个与子文件夹同名的文件,并在文件名后添加。py。我的文件名是notebook。py。你可以按自己心意给这个Python文件命名。 现在notebookc目录内容如下:。git 。gitignore LICENSE README。rst notebookcinit。py notebookcnotebookc。py 第7步:创建和安装requirementsdev。txt 在项目目录顶端创建一个requirementsdev。txt文件。通常把这个文件命名为requirements。txt。这样命名强调了这些程序包全部是开发员安装的。 在requirementsdev。txt里,要安装特定版本的pip和wheel。 pip19。0。3 wheel0。33。1 注意,这里用两个等号以及版本号指明了应安装的程序包的确切版本。 将特定版本的程序包安装到requirementsdev。txt中。 如果合作开发员要分裂项目知识库,用pip来安装特定requirementsdev。txt程序包,就要用和你一样版本的包。此外,在创建文件的时候,ReadTheDocs可使用这个文件来安装程序包。 在已经激活的虚拟环境中,使用以下命令将程序包安装到requirementsdev。txt: pipinstallrrequirementsdev。txt 第8步:代码和提交 作为示例,我们先创建一个很简单的函数。你可以之后再建一个很牛的函数。 在主文件中键入以下内容: (我们要键入的是notebookcnotebookcnotebookc。py)defconvert(myname): Printalineaboutconvertinganotebook。 Args: myname(str):personsname Returns: None print(fIllconvertanotebookforyousomeday,{myname}。) 这就是我们建的函数啦。 文档字符串(docstrings)以三个连续的双引号开始并结束。在以后的文章中,它们会被用于自动创建文档。 现在提交修改。 第9步:创建setup。py setup。py文件是程序包的构建脚本文件。Setuptools的setup函数可构建要上传到PyPI的程序包。Setuptools里有程序包的信息,版本号以及用户所需要的其他程序包的信息。 以下是本文的setup。py文件示例:fromsetuptoolsimportsetup,findpackages withopen(README。md,r)asreadmefile: readmereadmefile。read() requirements〔ipythongt;6,nbformatgt;4,nbconvertgt;5,requestsgt;2〕 setup( namenotebookc, version0。0。1, authorJeffHale, authoremailjeffmshalegmail。com, descriptionApackagetoconvertyourJupyterNotebook, longdescriptionreadme, longdescriptioncontenttypetextmarkdown, urlhttps:github。comyourpackagehomepage, packagesfindpackages(), installrequiresrequirements, classifiers〔 ProgrammingLanguage::Python::3。7, License::OSIApproved::GNUGeneralPublicLicensev3(GPLv3), 〕, ) 注意,longdescription是README。md文件内容里的。 在setuptools。setup。installrequiresincludes中指定的requirements列表包括了程序包运作所需的所有依赖程序包。 与requirementsdev。txt开发所需的包不同,这个包列表应尽可能地宽松。 将installrequires的包列表限制在只能安装需要的包,你肯定不想用户安装不必要的包。注意,只需要列出不属于Python标准库里的包即可。如果用户要用你的包的话,就必须要安装Python。 这个包不需要任何外部依赖,因此你可以剔除上面列出的四个包。如果共同开发员要分裂项目知识库,用pip安装特定包的话,要用和你一样版本的包。 将代码提交到本地Git知识库。现在万事俱备,可以开始建程序包了! 第10步:构建首个版本 Twine是一个公用程序组,可以在PyPI上安全地发布Python包。将Twine包添加到requirementsdev。txt的下一个空行中,如下所示:twine1。13。0 然后重新安装requirementsdev。txt包以将Twine安装到虚拟环境中。 pipinstallrrequirementsdev。txt 然后运行下列命令,创建包文件:pythonsetup。pysdistbdistwheel 过程中会创建许多隐藏的文件夹:dist,build等,我创建的是notebookc。egginfo。我们看下dist文件夹中的文件。。whl文件是Wheel文件,即创建的分布。。tar。gz文件是源代码压缩文档。 Wheel 在用户的设备上,pip会像wheels一样在任何可能的时候安装程序包。Wheel在安装的时候更快。当pip不能安装wheel时,它就会回到源代码压缩文档。 让我们准备好上传wheel和源代码压缩文档吧。 第11步:创建TestPyPI帐号 PyPI是PythonPackageIndex的缩写,它是Python官方程序包管理器。pip可以从PyPI中抓取没有在本地安装的文件。 PyPI TestPyPI是PyPI中运行的一个测试版本。注意,在测试站点上传和在官方站点上传的密码是不同的。 创建TestPyPI帐户:https:test。pypi。orgaccountregister。 第12步:在TestPyPI上发布 Twine 用Twine将你的程序包安全地发布到TestPyPI上。键入下列命令无需修改。 twineuploadrepositoryurlhttps:test。pypi。orglegacydist 系统会提示你输入用户名和密码。记住,TestPyPI和PyPI的密码是不同的。 需要的话,就修正包的错误,在setup。py中创建新的版本号,删除旧版本的build,dist和egg文件夹。用pythonsetup。pysdistbdistwheel重建,用Twine重新上传。在TestPyPI上的版本号没什么意义,这并不是大事,因为你是唯一用这些版本的包的人。 成功上传程序包之后,确认它可以被安装使用。 第13步:确认安装和使用 在终端创建另一个标签,并创建另一个虚拟环境。 python3。7mvenvmyenv 激活它 sourcemyenvbinactivate 如果你已经将包上传到PyPI官方网站,接下来就要用pip安装这个程序包。可以在PyPI检索到该程序包,然后用修改过的命令安装它。 从TestPyPI安装程序包的官方指导如下: 可以通过indexurlflag命令pip在TestPyPI上下载安装包,而不用在PyPI上下载。 pipinstallindexurlhttps:test。pypi。orgsimplemypackage 如果你要允许pip在PyPI上下载其他的包,可以命令extraindexurl指向PyPI。如果你测试的程序包有依赖包,这将会非常有用。 pipinstallindexurlhttps:test。pypi。orgsimpleextraindexurlhttps:pypi。orgsimplemypackage 如果你的程序包有包依赖,用上面提到的第二个命令,并替换你的程序包名称。 你应该看一下安装到虚拟环境的程序包的最新版本。 为了确认程序包可以使用,用python在终端启动IPyon会话。 导入函数并用字符串参数调用函数。我的代码如下: fromnotebookc。notebookcimportconvert convert(Jeff) 随后可以看到下面的输出:I’llconvertanotebookforyousomeday,Jeff。 确认可以用了。 好了,现在把作品上传到GitHub吧。 第14步:上传到GitHub 确保你的代码已提交。 notebookc项目文件夹如下所示:。git 。gitignore LICENSE README。md requirementsdev。txt setup。py notebookcinit。py notebookcnotebookc。py 剔除你不想上载的虚拟环境。在创建知识库时选择的Python的。gitignore文件可使构件不被列入索引。 你可能需要删除虚拟环境文件夹。 用gitpushoriginmybranch。将本地分支传到GitHub。 第15步:创建与合并PR 在浏览器中打开Github,可以看到拉入请求选项。长按绿色按钮创建并合并你的PR,并删除远程特征分支。 回到终端,使用gitbranchdmyfeaturebranch删除本地特征分支。 回顾:制作程序包的15个步骤 1。制定计划 2。命名 3。检查配置 4。在GitHub上创建组织 5。创建GitHub知识库 6。复制和添加目录 7。创建和安装requirementsdev。txt 8。代码和提交 9。创建setup。py 10。构建首个版本 11。创建TestPyPI账号 12。在TestPyPI上发布 13。确认安装和使用 14。上传到GithHub 15。创建与合并PR