博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python程序包的构建和发布过程
阅读量:6785 次
发布时间:2019-06-26

本文共 4811 字,大约阅读时间需要 16 分钟。

关于我

编程界的一名小程序猿,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。 联系:hylinux1024@gmail.com

当我们开发了一个开源项目时,就希望把这个项目打包然后发布到pypi.org上,别人就可以通过pip install的命令进行安装。本文的教程来自于,如有不正确的地方欢迎评论拍砖。

0x00 创建项目

本文使用到的项目目录为

➜  packaging-tutorial.└── bestpkg    └── __init__.py复制代码

接下来的所有操作都是在packing_tutorial这个目录下进行的。首先把bestpkg这个目录下的__init__.py添加以下内容

info='packaging demo'复制代码

这个信息主要用于打包成功后安装测试用的。

0x01 项目结构

一个待发布的项目还需要有以下这些文件:setup.pyLICENSEREADME.md

➜  packaging-tutorial.├── LICENSE├── README.md├── bestpkg│   └── __init__.py└── setup.py复制代码

0x02 setup.py

setup.py文件是给setuptools工具的使用脚本,告诉setuptools如何构建我们的项目。打开编辑器,编辑setup.py文件,输入以下内容

import setuptools# 读取项目的readme介绍with open("README.md", "r") as fh:    long_description = fh.read()setuptools.setup(    name="bestpkg",# 项目名称,保证它的唯一性,不要跟已存在的包名冲突即可    version="0.0.1",    author="hylinux1024", # 项目作者    author_email="hylinux1024@gmail.com",    description="一个牛逼的程序", # 项目的一句话描述    long_description=long_description,    long_description_content_type="text/markdown",    url="https://github.com/hylinux1024/niubiproject",# 项目地址    packages=setuptools.find_packages(),    classifiers=[        "Programming Language :: Python :: 3",        "License :: OSI Approved :: MIT License",        "Operating System :: OS Independent",    ],)复制代码
  • name
    项目名称,保证它的唯一性,不要跟已存在的包名冲突即可,否则会发布失败
  • version
    版本号
  • author
    作者
  • author_email
    作者邮箱
  • description
    一句话描述项目
  • long_description
    项目详细说明,一般直接读取README.md的内容
  • url
    项目的链接地址
  • packages
    列出当前项目的包,一般直接使用find_packages()即可
  • classifiers
    这里指定Python的兼容版本是Python3,也指定了项目使用的开源协议。

0x03 README.md

给项目添加详细的README

# Example PackageThis is a simple example package. You can use[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)to write your content.复制代码

0x04 LICENSE

要发布包到pypi上,选择一个合适的开源协议是非常重要的。如果不知道怎么选可以到这里看看。

0x05 项目打包

项目需要打包后才能发布,要打包项目需先安装最新版本的setuptoolswheel

➜ python3 -m pip install --user --upgrade setuptools wheel复制代码

然后使用以下命令进行打包

➜ python3 setup.py sdist bdist_wheel复制代码

当看到以下信息,说明已经打包成功

.........adding license file "LICENSE" (matched pattern "LICEN[CS]E*")creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEELcreating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to itadding 'bestpkg/__init__.py'adding 'bestpkg-0.0.1.dist-info/LICENSE'adding 'bestpkg-0.0.1.dist-info/METADATA'adding 'bestpkg-0.0.1.dist-info/WHEEL'adding 'bestpkg-0.0.1.dist-info/top_level.txt'adding 'bestpkg-0.0.1.dist-info/RECORD'removing build/bdist.macosx-10.14-x86_64/wheel复制代码

在项目目录下会生成一个distbuild文件夹

➜  packaging-tutorial tree.├── LICENSE├── README.md├── bestpkg│   └── __init__.py├── bestpkg.egg-info│   ├── PKG-INFO│   ├── SOURCES.txt│   ├── dependency_links.txt│   └── top_level.txt├── build│   ├── bdist.macosx-10.14-x86_64│   ├── bdist.macosx-10.9-x86_64│   └── lib│       └── bestpkg│           └── __init__.py├── dist│   ├── bestpkg-0.0.1-py3-none-any.whl│   └── bestpkg-0.0.1.tar.gz└── setup.py8 directories, 11 files复制代码

dist文件中有两个文件

dist    ├── bestpkg-0.0.1-py3-none-any.whl    └── bestpkg-0.0.1.tar.gz复制代码

tar.gz文件是源码文件压缩包,而.whl就是打包后的文件。最新的pip命令会安装这个.whl文件。

0x06 上传

现在就可以上传到Python索引库了。我们使用Test PyPI,这个是测试用的Pypi,本例子也是使用Test Pypi

首先要到注册账号。本例中我注册的账号为:hylinux1024

然后使用twine工具来上传我们的包。使用以下命令进行安装:

➜ python3 -m pip install --user --upgrade twine复制代码

使用以下命令上传dist目录下的文件

➜ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*复制代码

这个命令会提示输入刚在test.pypi.org上注册账号密码,并出现类似以下信息后说明已经上传成功。

Enter your username: hylinux1024Enter your password:Uploading distributions to https://test.pypi.org/legacy/Uploading bestpkg-0.0.1-py3-none-any.whl100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]Uploading bestpkg-0.0.1.tar.gz100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]复制代码

然后打开这个地址就可以看到我们发布的包。

0x07 安装

发布成功之后就可以使用pip来安装来。我们在虚拟环境中安装,关于虚拟环境可以看我。

这里就使用pipenv,这里我直接进入到我昨天创建的那个项目中,也为了更好演示安装结果。

➜ pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg复制代码

在这里我使用--index-url参数是为了指定从test.pypi.org中安装,而不是正式包索引库中查找要安装的包。还有使用了--no-deps参数是因为本例中没有使用到其它的依赖库。

在终端会看到以下类似信息,说明安装成功

Looking in indexes: https://test.pypi.org/simple/Collecting bestpkg  Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whlInstalling collected packages: bestpkgSuccessfully installed bestpkg-0.0.1复制代码

进入交互界面

(pipenvdemo) ➜  pipenvdemo python>>> import bestpkg>>> bestpkg.info'packaging demo'复制代码

info变量就是在__init__.py文件中定义的变量。自此我们的包发布、安装使用流程就走完了。

要在正式的Python索引库中发布,只需要到注册账号,并上传就可以了。

0x08 总结一下

通过一个简单的例子展示Python通过setuptools工具进行打包,然后上传到test.pypi.org的流程。如果要上传到正式的pypi.org上,只需要注册一个正式的账号。一旦发布成功就可以使用pip install [your-package]的命令进行安装。

0x09 引用

  • Packaging Python Projects

转载于:https://juejin.im/post/5cfbb40151882574ce013a57

你可能感兴趣的文章
spring的依赖注入(DI)、控制反转(IOC)和面向切面(AOP)
查看>>
Web前端面试宝典(最新)
查看>>
@font-face字图标问题
查看>>
python-week1-postman+jemter-soapUI
查看>>
POJ 3349 Snowflake Snow Snowflakes 暴力
查看>>
LoadRunner性能测试入门教程
查看>>
Java I/O Properties的使用 存取配置文件
查看>>
关于开源的一点看法
查看>>
bzoj 3328 PYXFIB——单位根反演
查看>>
bzoj1037生日聚会
查看>>
eclipse-->切换语言版本
查看>>
配置IIS服务器,APK文件下载
查看>>
2003应用池假死常见问题和解决方法
查看>>
使用javascript的日期函数
查看>>
c# : use xsd 校验 xml
查看>>
mybatis初接触
查看>>
没有测试的开发是多么的悲催哇
查看>>
awk的日志模块追加日期时间字段的方案
查看>>
[转]高级SQL注入:混淆和绕过
查看>>
System.IO.Path 文件名、路径、扩展名处理
查看>>