...

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(安装脚本,也包含依赖包列表),如下图:

image

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')

上传Pypi后,对应的页面信息如下图:
image

需要注意的是,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即可看到函数的调用结果
image

示例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 中使用该模块,而且可以在源代码发生变化时,自动更新软链接,无需重新安装模块。

执行build后生成编译后的build目录
image

执行install后(默认按egg格式安装)生成目录
image

执行develop命令后只生成egg-link链接
image

在有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 分发包。

执行后分别在dist目录生成该版本对应的包
image

一般建议只使用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配置打包信息

参考

posted @ 2023-06-17 01:16  韩志超  阅读(1453)  评论(0编辑  收藏  举报