python制作wheel包
参考链接:
创建 pip 模块
一、创建项目
想要创建一个模块,要先创建一个项目,写上你的代码。譬如项目结构如下:
test
- LICENSE # 声明代码的授权用途
- README.md # 模块介绍
- demos # 这是一个包,里面包含 __init__.py
- __init__.py
- demo.py
- pipmodule # 这也是一个包,也包含 __init__.py
- __init__.py
- mycode.py
- setup.py # 打包的配置文件
1.1 License
License 也就是项目的许可证。一般开源的软件可以使用相对宽泛的许可,譬如 MIT,它代表作者保留版权,其他任何人都可以使用,无其他限制。
MIT
:
Copyright (c) 2022 MY_TEST_CODE
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
更多 license,参见:这里
1.2 Readme
README.md 通常是一个项目的说明文件,来说明项目的用途和简单的介绍。
README.md
# Introduce
This is a test project for building a pip module.
1.3 pipmodule 包
创建我们的代码:
pipmodule/mycode.py
def mycode():
print("This is a test code.")
1.4 demos 包
简单写写我们项目的用法:
demos/demo.py
from pipmodule import mycode
mycode.mycode()
1.5 setup.py
编写打包的配置:
import setuptools
with open("README.md", "r") as f:
long_description = f.read()
setuptools.setup(
name="pipmodule", # 打包后生成的文件名,会以这个 name 为前缀
version="1.0", # 版本
author="wzt", # 作者
author_email="asodfie@qq.com", # 作者邮箱
description="A pipmodule package", # 简短的描述
long_description=long_description, # 详细描述
long_description_content_type="text/markdown", # 详细描述的文本类型
packages=setuptools.find_packages(), # 自动查找当前项目下的所有的包。譬如当前项目有 'demos', 'pipmodule' 两个包,这样这两个包都会被打包进最终生成的模块中。
url="https://www.baidu.com", # 项目地址
# 配置元数据信息。更多内容参见:https://pypi.org/pypi?%3Aaction=list_classifiers
classifiers=[
"Development Status :: 3 - Alpha", # 项目开发阶段
"Programming Language :: Python :: 3", # 编程语言
"License :: OSI Approved :: MIT License", # license
"Operating System :: OS Independent", # 操作系统
],
# 当前项目的依赖,比如当前项目依赖了 requests 库,当按照当前的模块时,会自动把 requests 也安装上
install_requires=[
"requests",
# "pytest>=3.3.1", # 也可以出依赖的具体版本
],
package_data={"pipmodule": ["*.jpg", ]}, # package_data 可以将一些静态的包内的文件,打包进你的模块中,文件支持通配符的方式,如:{"package_name": ["*.txt", "*.jpg"]}
python_requires=">=3" # 设置当前项目适用的 python 版本:3,也可以写成支持多个版本的范围:">=2.7, <=3"
)
setuptools.setup
除了上面的参数选项,还有一些其他选项:
# package_data 可以将一些静态的包内的文件,打包进你的模块中,文件支持通配符的方式如:{"xxx": ["*.txt", "*.jpg"]}
package_data = {"你的包名": ["file1", "fil2", ...]}
# exclude_package_data 可以排除一些包内的文件
exclude_package_data={'你的包名':['*.txt']}
# include_package_data 设为 True 时,它会自动打包包中已经受到版本控制的文件,某些方面可以替代 package_data 这个参数(没有进行版本控制的文件,依然要使用 package_data 这个选项来添加)
include_package_data = True
# 这个选项可以设置一些本地的源文件,当用户安装这个模块时,会自动将 "源文件" 复制到到 ”要安装的地方“
data_files = [("要安装到哪儿1", "源文件1"), ("要安装到哪儿2", "源文件2"), ...]
你还可以创建一个和 setup.py
同级的配置文件:MANIFEST.in
,它可以配置文件的分发,setup.py
会自动读取它。举例:
include *.txt
recursive-include demos *.txt *.jpg *.py
prune demos/sample?/build
这个配置文件:
- 会包含所有的 txt 文件
- 会递归查询 demos 和子目录,以及所有的 txt,jpg,py 文件
- 排除匹配
demos/sample?/build
的路径
二、打包分发
2.1 安装 setuptools, wheel
pip install setuptools
pip install wheel
2.2 模块打包
python setup.py sdist bdist_wheel
sdist
是用来构建源码分发包,即.tar.gz
这种格式
bdist_wheel
是创建一个whl
分发包在项目的根目录运行上面的代码,会产生一个
dist
的目录,里面存放了一个pipmodule-1.0-py3-none-any.whl
文件和一个pipmodule-1.0.tar.gz
文件。 文件名中的pipmodule
前缀就来自setuptools.setup
函数中的name
参数。
2.3 上传至 PyPi
安装上传工具:
pip install twine
上传 dist
文件夹下所有内容到 PyPi 上 :
twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
上传的过程中,会提示你输入 PyPi 的账号和密码,所以需要事先在
pypi.org
网站上创建账号。
2.4 安装包
使用网络,从 pypi 下载安装:
pip install pipmodule
我们其实还可以通过我们的源代码进行安装:
python setup.py install
2.5 使用
当我们安装完成后,python 的 site-package
目录下会多两个包:demos
, pipmodule
,也就是我们项目中写的包:
>>> from pipmodule import mycode
>>> mycode.mycode()
This is a pipmodule code.
>>> from demos import demo
This is a pipmodule code.