社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python程序包的构建和发布过程

GoT阳仔 • 6 年前 • 160 次点击  
阅读 19

Python程序包的构建和发布过程

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

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

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 Package

This 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上,选择一个合适的开源协议是非常重要的。如果不知道怎么选可以到choosealicense.com/这里看看。

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/WHEEL
creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it
adding '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.py

8 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

首先要到test.pypi.org/account/reg…注册账号。本例中我注册的账号为: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: hylinux1024
Enter your password:
Uploading distributions to https://test.pypi.org/legacy/
Uploading bestpkg-0.0.1-py3-none-any.whl
100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]
Uploading bestpkg-0.0.1.tar.gz
100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]
复制代码

然后打开test.pypi.org/project/bes…这个地址就可以看到我们发布的包。

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.whl
Installing collected packages: bestpkg
Successfully installed bestpkg-0.0.1
复制代码

进入交互界面

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

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

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

0x08 总结一下

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

0x09 引用

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34303
 
160 次点击