想拥有自己的Python程序包,你只需15步
来源商业新知网,原标题:15步,你就能拥有自己的Python程序包
全文共 3192 字,预计学习时长 6 分钟
每个软件开发员和数据科学家都难免要做程序包。本文推荐一篇 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.org/downloads/
GitHub
免费注册GitHub账户:https://github.com/join
安装Git:https://help.github.com/articles/set-up-git/
Homebrew
Homebrew是Mac系统特有的程序包管理器。(安装说明:https://brew.sh/)。
Venv
如果使用的是Python3.6版本,建议用venv来创建虚拟环境以构建程序包。用Python来管理虚拟环境的方法很多,可遵循的建议也有很多。
从Python3.3版本起,Python就自带venv了,但要注意,从Python3.4的版本开始,venv才能在虚拟环境中安装pip和setuptools。
用下列命令在Python3.7中创建虚拟环境:
python3.7-m venv my_env
用你喜欢的名字替换 my_env,激活虚拟环境:
sourcemy_env/bin/activate
现在可以在终端提示的最左端看到 (my_env) ,或者看到你给虚拟环境取的名字。
完成之后,使用deactivate停用虚拟环境。
之后,在GitHub上进行设置。
第4步:在GitHub上创建组织
GitHub在版本控制注册上是市场领导者,其他的包括GitLab 和Bitbucket也很受欢迎。本指南中我们是用GitHub。
按照提示,在GitHub上创建一个新组织。我们将组织命名为notebooktoall。你可以在个人帐户下创建知识库(repository),但我们的目标之一是学习如何为更大的群体创建一个开源项目。
第5步:创建GitHub知识库
创建一个新的知识库。
从下拉列表中添加gitignore,为你的知识库选择Python。gitignore文件的内容与要从Git知识库中剔除的文件夹和文件类型相匹配。你可以之后再修改gitignore以剔除其他不必要或敏感的文件。
建议从下拉列表的添加许可证(Add alicense)中选择一个许可证,它决定了使用知识库内容的用户能做什么。一些许可证会比较宽松,如果没有选择许可证,系统会采用默认的版权法。
本文的项目选的是通用公共许可证v3.0(GeneralPublic Licens v3.0 ),因为它用的广泛,而且可以“保证终端用户运行、学习、共享和修改软件的自由”——来自维基百科。
第6步:复制和添加目录
选择要在本地复制知识库的位置,然后按下面的说明运行:
复制git https://github.com/notebooktoall/notebookc.git
替代组织和知识库。
使用桌面图形用户界面(GUI)或代码编辑器进入项目文件夹,或者用cd my-project的命令行进入项目文件夹,然后用 ls—A查看文件。初始文件夹和文件如下:
.git
.gitignore LICENSE README.rst
为主项目文件创建一个子文件夹,建议子文件夹的命名与程序包的相同,并确认名称不包含空格。
在子文件夹中创建一个名为 __init__.py的文件,这个文件可以先空着。将文件导入到子文件夹时,这个文件是必需的。
创建另一个与子文件夹同名的文件,并在文件名后添加.py。我的文件名是notebook .py。你可以按自己心意给这个Python文件命名。
现在notebookc目录内容如下:
.git
.gitignore LICENSE README.rst
notebookc/__init__.py
notebookc/notebookc.py
第7步:创建和安装requirements_dev.txt
在项目目录顶端创建一个requirements_dev.txt文件。通常把这个文件命名为requirements.txt。这样命名强调了这些程序包全部是开发员安装的。
在requirements_dev.txt里,要安装特定版本的pip和wheel。
pip==19.0.3
wheel==0.33.1
注意,这里用两个等号以及版本号指明了应安装的程序包的确切版本。
将特定版本的程序包安装到requirements_dev.txt中。
如果合作开发员要分裂项目知识库,用pip来安装特定requirements_dev.txt程序包,就要用和你一样版本的包。此外,在创建文件的时候,Read TheDocs可使用这个文件来安装程序包。
在已经激活的虚拟环境中,使用以下命令将程序包安装到requirements_dev.txt:
pipinstall -r requirements_dev.txt
第8步:代码和提交
作为示例,我们先创建一个很简单的函数。你可以之后再建一个很牛的函数。
在主文件中键入以下内容:
(我们要键入的是 notebookc/notebookc/notebookc.py)
def convert(my_name):
"""
Print a lineabout converting a notebook.
Args:
my_name(str): person's name
Returns:
None
"""
print(f"I'll convert a notebook for you some day, {my_name}.")
这就是我们建的函数啦。
文档字符串(docstrings)以三个连续的双引号开始并结束。在以后的文章中,它们会被用于自动创建文档。
现在提交修改。
第9步:创建setup.py
setup.py文件是程序包的构建脚本文件。Setuptools的setup函数可构建要上传到PyPI的程序包。Setuptools里有程序包的信息,版本号以及用户所需要的其他程序包的信息。
以下是本文的setup.py文件示例:
from setuptools import setup, find_packages
with open("README.md", "r") asreadme_file:
readme =readme_file.read()
requirements = ["ipython>=6","nbformat>=4", "nbconvert>=5","requests>=2"]
setup(
name="notebookc",
version="0.0.1",
author="Jeff Hale",
author_email="jeffmshale@gmail.com",
description="A package to convert your Jupyter Notebook",
long_description=readme,
long_description_content_type="text/markdown",
url="https://github.com/your_package/homepage/",
packages=find_packages(),
install_requires=requirements,
classifiers=[
"Programming Language :: Python :: 3.7",
"License :: OSI Approved :: GNU General Public License v3(GPLv3)",
],
)
注意,long_description是README.md文件内容里的。
在setuptools.setup.install_requiresincludes中指定的 requirements列表包括了程序包运作所需的所有依赖程序包。
与requirements_dev.txt开发所需的包不同,这个包列表应尽可能地宽松。
将install_requires的包列表限制在只能安装需要的包,你肯定不想用户安装不必要的包。注意,只需要列出不属于Python标准库里的包即可。如果用户要用你的包的话,就必须要安装Python。
这个包不需要任何外部依赖,因此你可以剔除上面列出的四个包。如果共同开发员要分裂项目知识库,用pip安装特定包的话,要用和你一样版本的包。
将代码提交到本地Git知识库。现在万事俱备,可以开始建程序包了!
第10步:构建首个版本
Twine是一个公用程序组,可以在PyPI上安全地发布Python包。将Twine包添加到 requirements_dev.txt 的下一个空行中,如下所示:
twine==1.13.0
然后重新安装requirements_dev.txt包以将Twine安装到虚拟环境中。
pipinstall -r requirements_dev.txt
然后运行下列命令,创建包文件:
pythonsetup.py sdist bdist_wheel
过程中会创建许多隐藏的文件夹:dist, build等,我创建的是notebookc.egg-info。我们看下dist文件夹中的文件。.whl文件是Wheel文件,即创建的分布。.tar.gz文件是源代码压缩文档。
Wheel
在用户的设备上,pip会像wheels一样在任何可能的时候安装程序包。Wheel在安装的时候更快。当pip不能安装wheel时,它就会回到源代码压缩文档。
让我们准备好上传wheel和源代码压缩文档吧。
第11步:创建TestPyPI帐号
PyPI是Python Package Index的缩写,它是Python官方程序包管理器。pip可以从PyPI中抓取没有在本地安装的文件。
PyPI
TestPyPI是PyPI中运行的一个测试版本。注意,在测试站点上传和在官方站点上传的密码是不同的。
创建TestPyPI帐户: https://test.pypi.org/account/register/。
第12步:在TestPyPI上发布
Twine
用Twine将你的程序包安全地发布到TestPyPI上。键入下列命令——无需修改。
twineupload --repository-url https://test.pypi.org/legacy/ dist/*
系统会提示你输入用户名和密码。记住,TestPyPI和PyPI 的密码是不同的。
需要的话,就修正包的错误,在setup.py中创建新的版本号,删除旧版本的build, dist和 egg 文件夹。用pythonsetup.py sdist bdist_wheel重建,用Twine重新上传。在TestPyPI上的版本号没什么意义,这并不是大事,因为你是唯一用这些版本的包的人。
成功上传程序包之后,确认它可以被安装使用。
第13步:确认安装和使用
在终端创建另一个标签,并创建另一个虚拟环境。
python3.7-m venv my_env
激活它
source my_env/bin/activate
如果你已经将包上传到PyPI 官方网站,接下来就要用pip安装这个程序包。可以在PyPI检索到该程序包,然后用修改过的命令安装它。
从TestPyPI安装程序包的官方指导如下:
可以通过— index-url flag命令pip在TestPyPI上下载安装包,而不用在PyPI 上下载。
pip install--index-url https://test.pypi.org/simple/ my_package
如果你要允许pip在PyPI上下载其他的包,可以命令— extra-index-url指向PyPI。如果你测试的程序包有依赖包,这将会非常有用。
pipinstall --index-url https://test.pypi.org/simple/ --extra-index-urlhttps://pypi.org/simple my_package
如果你的程序包有包依赖,用上面提到的第二个命令,并替换你的程序包名称。
你应该看一下安装到虚拟环境的程序包的最新版本。
为了确认程序包可以使用,用python在终端启动IPyon会话。
导入函数并用字符串参数调用函数。我的代码如下:
fromnotebookc.notebookc import convert
convert(“Jeff”)
随后可以看到下面的输出:
I’llconvert a notebook for you some day, Jeff.
确认可以用了。
好了,现在把作品上传到Git Hub吧。
第14步:上传到GitHub
确保你的代码已提交。
notebookc项目文件夹如下所示:
.git
.gitignore LICENSE README.md requirements_dev.txt setup.py
notebookc/__init__.py
notebookc/notebookc.py
剔除你不想上载的虚拟环境。在创建知识库时选择的Python的 .gitignore文件可使构件不被列入索引。
你可能需要删除虚拟环境文件夹。
用git pushorigin my_branch.将本地分支传到GitHub。
第15步:创建与合并PR
在浏览器中打开Github,可以看到拉入请求选项。长按绿色按钮创建并合并你的PR,并删除远程特征分支。
回到终端,使用gitbranch -d my_feature_branch删除本地特征分支。
回顾:制作程序包的15个步骤
1. 制定计划
2. 命名
3. 检查配置
4. 在GitHub上创建组织
5. 创建GitHub知识库
6. 复制和添加目录
7. 创建和安装requirements_dev.txt
8. 代码和提交
9. 创建 setup.py
10. 构建首个版本
11. 创建TestPyPI账号
12. 在TestPyPI上发布
13. 确认安装和使用
14. 上传到 GithHub
15. 创建与合并PR
留言 点赞 发个朋友圈
我们一起分享AI学习与发展的干货
编译组:吕淋、赵璇
想拥有自己的Python程序包,你只需15步的更多相关文章
- 利用 pip 安装 Python 程序包到个人用户文件夹下
利用 --user 参数,即 pip install --user package_name 这样会将Python 程序包安装到 $HOME/.local 路径下,其中包含三个字文件夹:bin,lib ...
- 为什么学Python语言,只需四步全面了解Python语言
为什么学Python语言,只需四步全面了解Python语言每个时代都会悄悄犒赏会选择的人,Python现在风口的语言Python--第三大主流编程语言Python , 是一种面向对象的解释型计算机程序 ...
- 教程|要想Hadoop能够运行Python程序,就要会MRJob
首先 要想Hadoop能够很流畅的Python程序,学习mrjob可能是最直接.最简单的方法了 你甚至都不要按安装部署Hadoop集群. mrjob拥有很多优秀的特性比如: 支持多步骤的MapRedu ...
- Python程序包的构建和发布过程
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- pip升级Python程序包
列出当前安装的包: pip list 列出可升级的包: pip list --outdate 升级一个包: pip install --upgrade requests // mac,linux,un ...
- Python自动群发邮件,只需20行代码!
今日分享 Python自动群发邮件 import smtplib from email import (header) from email.mime import (text, applicatio ...
- 只需两步获取任何微信小程序源码
http://baijiahao.baidu.com/s?id=1601969343738344659&wfr=spider&for=pc
- 教你如何编写、保存与运行 Python 程序
第一步 接下来我们将看见如何在 Python 中运行一个传统的“Hello World”程序.Python教程本章将会教你如何编写.保存与运行 Python 程序. 通过 Python 来运行的你的程 ...
- Python程序的执行过程
1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言, ...
随机推荐
- 一位工作8年的java软件工程师该如何发展
从08年到现在已工作8年多了,但是对职业生涯的规划还没有很清晰的定义,可能之前做的工作太杂太广,回想第一家公司从事了6年有得也有失,虽然涉及到开发.设计.管理等岗位,但从技术上总结并没有很擅长的技术, ...
- c# 16进制大端小端解析长度
//前两个字节为长度的解析string hexstr = "00 13 59 02 80 00 E7 00 80 00 E9 00 80 00 EA 00 80 00 EB 00 80&qu ...
- CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证
CentOS7用hostapd做radius服务器为WiFi提供802.1X企业认证 来源: https://www.cnblogs.com/osnosn/p/10593297.html 来自osno ...
- PHP安装Eclipse与使用
PHP有非常多相当不错的开发工具,如Zend Studio.NetBeans.phpdesigner等,但对于习惯Java编程的程序员们来说,最经常使用的还要属Eclipse. 那么Eclipse能用 ...
- 批处理for中字符串截取必须先把循环变量代替出来才行!!!
@echo off & setlocal enabledelayedexpansion set ifo=abc,def,ghi,jkl,mnopqrstuvwxyz0123456789 ech ...
- global的使用
对于一个全局变量,你的函数里如果只使用到了它的值,而没有对其赋值(指a = XXX这种写法)的话,就不需要声明global. 相反,如果你对其赋了值的话,那么你就需要声明global.声明global ...
- 再见VB6!再见程序生涯!
今天写一篇博文告别使用了15年的VB6,从此终结程序生涯.记得读大学的时候第一学习编程,用VB6嵌入MediaPlayer控件写了一个简易视频播放器,看着视频的画面激动人心,从此就爱上了编程,从此也和 ...
- shell脚本命令远程连接ssh并执行命令
环境: redhat 6.5 根据网上提供方法,测试了很多写法都不成功,测试了很久才有了以下脚本. 命令远程连接ssh并执行命令,scp/ftp等远程连接操作同理: #!/usr/bin/expect ...
- C#添加VisionPro控件问题
安装完VisionPro8.2版本以后,用VS2013调用时,没有默认在工具箱内,那么就需要手动添加了,选择菜单栏---->工具----->选择工具箱项,如下图所示: ...
- Python全栈开发记录_第四篇(集合、函数等知识点)
知识点1:深拷贝和浅拷贝 非拷贝(=赋值:数据完全共享,内存地址一样,修改一个另一个也变化) 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)像[[1,2],3,4]如果修改列表中列 ...