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
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={‘excel_runner.lib’: [’*.txt’]}每个包含资源文件目录要单独指定
data_files其他数据文件列表
scripts要安装的脚本列表
cmdclass自定义命令列表
ext_modules扩展模块列表
test_suite测试套件名称
tests_requiretests_requiretests_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配置打包信息

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临渊-测试开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值