Python项目打包及发布
项目结构设置#
在项目目录中建议建一个包,所有的代码实现放到包下,示例如下
excel-runner # 项目目录,可以包含中划线
excel_runner/ # 包名,只能包含字母数字下划线,不能包含中划线
__init__.py
runner.py # 代码实现
setup.py # 安装脚本
requirements.txt # 依赖列表
README.md # 使用说明
注意:如果runner.py直接放到excel-runner中,并且setup.py未指定entry_points时,安装后就只用一个runner.py没有所属包。
requirements.txt和setup.py的区别#
项目中一般既要有 requriements.txt
(依赖包列表) 也有 setup.py
(安装脚本,也包含依赖包列表),如下图:
requirements.txt是用来列出所有依赖包的,例如
# requirements.txt文件内容
requests
openpyxl
每个依赖包也可以限定版本
是方便别人下载好你项目源码后,批量安装依赖包的,安装命令为
pip install -r requirements.txt
setup.py 是用来打安装包的,是用来让别人安装后使用的,基本格式如下:
# setup.py文件内容
from setuptools import setup
setup(
name='excel-runner', # 应用名(pip安装和卸载时的名字)
version='0.1.0', # 当前版本
author='Han Zhichao', # 作者
author_email='superhin@126.com', # 作者邮箱
licence='MIT License', # 许可协议
url='http://github.com/hanzhichao/excel-runner', # 应用主页链接
install_requires=['requests', 'openpyxl'], # 依赖包
)
这里install_requires是安装依赖,安装该包时会自动从Pypi上搜索并安装依赖包。
setup.py编写#
setup() 函数是 Python 中用于定义和配置 Python 包的函数,它通常在 setup.py 文件中使用。setup() 函数包含了许多参数,用于指定包的名称、版本、作者、依赖项、入口点等信息。下面是一些常见的 setup() 函数参数:
参数 | 说明 | 示例 | 备注 |
---|---|---|---|
name | 包的名称 | name='excel-runner' |
pip安装和卸载时到包名,可以和导入使用时到包名(内部包名)不同 |
version | 包的版本号 | version='0.1.0' |
|
description | 包的描述信息 | description='http request runner based on excel' |
|
long_description | 包的详细描述信息 | 可以读取README.md完整内容 | |
author | 包的作者 | author='Han Zhichao' |
默认作者也是maintainer(维护者) |
author_email | 作者的电子邮件地址 | author_email= 'superhin@126.com' |
|
url | 包的主页地址 | url='http://github.com/hanzhichao/excel-runner' |
|
packages | 要打包的 Python 包列表 | ||
install_requires | 包的依赖项列表 | install_requires=['requests', 'openpyxl'] | 也可以限定依赖包的具体版本 |
entry_points | 包的入口点列表 | entry_points={ 'console_scripts': ['excel-runner = excel_runner.runner:hi']} |
|
classifiers | 包的分类列表 | 支持的Python版本列表 | |
license | 包的许可证类型 | license='MIT License' |
|
keywords | 包的关键字列表 | keywords=['excel_api_test','excel_api_runner', 'excel_http_runner'] |
|
zip_safe | 是否可以安全地使用 ZIP 文件格式 | zip_safe=True |
|
include_package_data | 是否包含包数据文件 | include_package_data=True |
需要包含非.py资源文件时应启用 |
package_data | 包数据文件列表 | package_data= | 每个包含资源文件目录要单独指定 |
data_files | 其他数据文件列表 | ||
scripts | 要安装的脚本列表 | ||
cmdclass | 自定义命令列表 | ||
ext_modules | 扩展模块列表 | ||
test_suite | 测试套件名称 | ||
tests_require | tests_require | tests_require = ('pytest>=6.2.5', 'pytest-cov>=3.0.0', 'pytest-network>=0.0.1') |
需要注意的是,setup() 函数的参数非常多,而且不同的参数可能有不同的取值范围和默认值。在使用 setup() 函数时,应该根据实际情况选择合适的参数,并仔细阅读官方文档以了解每个参数的含义和用法。
实例参考:octodns
setup.py常用技巧#
- 读取README.md
- find_packages过滤和排除
- 自动计算版本
示例1-包含数据文件#
待补充 ...
示例2-生成命令行工具#
在setup.py的setup()函数中使用entry_points可以指定多个入口点,一个内置的入口点是conseole_scprpts,配置格式如下
entry_points={
'console_scripts': [
'excel-runner = excel_runner.runner:hi', # 命令1:对应的包.模块:函数
],
}
卸载重新python setup.py install后,在命令行输入命令excel-runer
即可看到函数的调用结果
示例3-多包入口点联动(支持三方插件)#
待补充 ...
setup.py常用命令#
编译及安装#
- python setup.py build:构建和编译模块,生成编译后的扩展模块。
- python setup.py install:安装模块),将编译后的扩展模块安装到 Python 环境中。
- python setup.py develop: 开发模式安装模块,将当前源码软链到Python环境中,源码修改后,无需重新安装。
python setup.py install 和 python setup.py develop 命令的区别
install 命令会将模块安装到 Python 环境中,通常是将模块的源代码和编译后的扩展模块复制到 Python 的安装目录中。这样,我们就可以在 Python 中使用该模块了。
develop 命令也会将模块安装到 Python 环境中,但它不会将模块的源代码和编译后的扩展模块复制到 Python 的安装目录中。相反,它会在当前目录下创建一个名为 .egg-link 的软链接,指向模块的源代码所在的目录。这样,我们就可以在 Python 中使用该模块,而且可以在源代码发生变化时,自动更新软链接,无需重新安装模块。
在有setup.py中项目中也可以使用
pip install .
来安装
或者使用pip install git+https://github.com/hanzhichao/excel-runner
直接从包含setup.py的项目仓库安装
打包#
- python setup.py sdist:打包源代码,生成一个源代码分发包。
- python setup.py bdist:打包二进制代码,生成一个二进制代码分发包。
- python setup.py bdist_egg:打包二进制代码,生成一个Egg分发包。
- python setup.py bdist_wheel:打包二进制代码,生成一个 Wheel 分发包。
一般建议只使用sdist和bdist_whell分别生成源码包和wheel包。
python setuplpy sdist bdist_wheel
sdist生成的源码包和bdist_wheel生成wheel包可以使用pip命令直接安装,把该包发给用户后,用户可以通过
pip install excel-runner-0.1.0.tar.gz
或
pip install excel_runner-0.1.0-py3-none-any.whl
直接安装你的包,相关的依赖包requests和openpyxl会自动下载安装(需要联网)
egg包需要安装easy_install,然后使用
easy_install excel_runner-0.1.0-py3.9.egg
命令安装
easy_install可以使用curl https://bootstrap.pypa.io/ez_setup.py -o - | python
命令进行安装
bdist包可以解压,并把里面site-packages中的内容手动拷贝到系统site-pacakges里使用
上传#
- python setup.py upload:上传模块到 PyPI,将打包后的分发包上传到 Python Package Index(PyPI)。
或者使用三方包twine上传发布Pypi
安装方法
pip install twine
打包sdist和bdist_wheel后使用以下命令上传
twine uploads dist/*
输入你的pypi用户名和密码即可
使用setup.cfg配置打包信息#
除了使用setup.py外,还可以使用配置文件setup.cfg来描述打包信息,
setup.cfg主要包含metadata元信息和options选项两个段:
常见配置如下:
[metadata]
元信息#
- name:包的名称
- verion: 包的版本号
- author: 包的作者
- author_email: 包作者的邮件地址
- description: 包的描述
- long_description: 包的详细描述
- licence: 包的许可协议
- url: 包的链接地址
- keywords: 包的关键字列表
[options]
配置项#
- python_requires: 适用的Python版本
- packages: 要打包的 Python 包列表
- install_requires: 包的依赖项列表
- [options.extras_require] : 包的其他依赖(开发依赖项列表、测试依赖项列表)
- [options.entry_points] : 包的入口点列表
- [options.package_data] : 包数据文件列表
实例参考: octodns
项目中存在setup.cfg,也需要编写setup.py文件,setup()函数内容留空即可,参考代码如下:
from setuptools import setup
setup()
在项目中同样可以使用setup.py相关命令进行编译、安装、发布等。
使用pyproject.toml配置打包信息#
参考#
作者:韩志超
出处:https://www.cnblogs.com/superhin/p/python-setup-and-install.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如有问题,请微信联系 superz-han,并发送原文链接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)