python模块打包上传pypi
pytest hook函数二次开发 修改默认编码 显示中文用例名称
官方文档 : https://packaging.python.org/en/latest/tutorials/packaging-projects/
1. pypi注册
先在pypi.org上注册账户密码 地址: www.pypi.org
包
模块尽量都保存在包中,如果要进行模块的定义,首先定义的就是包,
所以每个目录下需要一个__init__.py的文件,可以为空内容,但必须有。
项目的根目录,保存所有的项目代码
程序执行文件,main.py,移动程序
setup.py,打包及其信息说明
【包】包名,从此处开始到末尾,统称为模块
__init__.py
【包】包名
__init__.py
【包】包名
__init__.py
源文件名.py
打包项目构成
源码包
setup.py
测试包
整体结构
2.setup.py模板
from setuptools import setup,find_packages
setup(
name='pytest_encode',
url='https://github.com/xxx/pytest-encode',
version='1.0',
author="xixi",
author_email='dasun@qq.com',
description='set your encoding and logger',
long_description='Show Chinese for your mark.parametrize(). Define logger variable for getting your log',
classifiers=[# 分类索引 ,pip 对所属包的分类
'Framework :: Pytest',
'Programming Language :: Python',
'Topic :: Software Development :: Testing',
'Programming Language :: Python :: 3.8',
],
license='proprietary',
packages = find_packages(), #['pytest_encode'],
keywords=[
'pytest', 'py.test', 'pytest_encode',
],
# 需要安装的依赖
install_requires=[
'pytest'
],
# 入口模块 或者入口函数
entry_points={
'pytest11': [
'pytest_encode = pytest_encode.main',
]
},
zip_safe=False
)
name 就是包名
version 包的版本号
packages 可引入的包的名字,也可以使用setuptools.find_packages()去自动导入,我这里就一个包,所以直接写了
LICENSE 许可证,详细信息可以去官网查看
3.main.py
'''
@File : main.py
@Time : 2022/2/12
@Author: sunda
@Software: PyCharm
'''
#收集完测试用例 之后被调用的hook函数
# pytest_collection_modifyitems 修改默认编码 显示中文用例名称
from typing import List
def pytest_collection_modifyitems(
session: "Session", config: "Config", items: List["Item"]
) -> None:
print(items)
#name 用例名字
#nodeid 测试用例路径
for item in items:
item.name = item.name.encode('utf-8').decode('unicode-escape')
item._nodeid= item.nodeid.encode('utf-8').decode('unicode-escape')
4.test
import pytest
@pytest.mark.parametrize("x,y,z",[[1,2,3],[2,2,4],[2,2,5]])
def test_bar1(x,y,z):
assert x+y==z
@pytest.mark.parametrize("name",['小米','小明'],ids=['名称1','名称2'])
def test_bar2(name):
print(f"{name}")
assert True
直接运行结果
打包命令
依赖包安装
pip install setuptools python的包管理工具 负责安装和发布 尤其是安装拥有依赖关系的包
pip install wheel 生成 *.whl格式的安装包 本质上也是一个压缩包
打包命令
python setup.py sdist bdist_wheel
打包完成结构
本地直接安装 打包完成后的库
选择dist下的whl文件
执行 pip install **.whl
此时打包好的库成功下载
再次运行 test
发布pypi
发布pypi有两种选择
一种是 upload.pypi.org 直接上传到pypi
一种是 test.pypi
https://upload.pypi.org/legacy/ or https://test.pypi.org/legacy/
pypi.org上注册账户密码 地址: www.pypi.org
或者
在 TestPyPI 上注册一个帐户,这是一个用于测试和实验的包索引的单独实例
要注册帐户,请转到 https://test.pypi.org/account/register/并完成该页面上的步骤
上传时都需生成token进行上传
举例
登录 TestPyPI 生成一个token,
下载依赖
Unix/macOS
python3 -m pip install --upgrade twine 下载twine依赖
python3 -m twine upload --repository testpypi dist/* 上传
win
py -m pip install --upgrade twine
py -m twine upload --repository testpypi dist/*
使用pypi 上传时将 --repository testpypi 更换为 --repository pypi
此时 用户名输入 token_
密码输入 刚刚获取的token值
验证
登录testpipy
上传后,您的包应该可以在 TestPyPI 上查看;例如: https://test.pypi.org/project/example_package_YOUR_USERNAME_HERE
下载上传的库
py -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-package-YOUR-USERNAME-HERE
更新版本
更新版本也很简单,只需要修改setup.py下的version
然后重新生成档案,上传
python setup.py sdist bdist_wheel
py -m twine upload --repository testpypi dist/*
更新本地moudle版本
pip install --upgrade string2date
或者是先卸载,再安装
# 卸载
pip uninstall pytest-encode
# 安装
pip install pytest-encode
常见问题
这里上传可能会出现了几种问题,(我把坑踩完了) 1、出现twine不会被识别为内部或外部命令
解决:把C:\Users\myname\AppData\Roaming\Python\Python36\Scripts加入系统变量
2、HTTPError: 403 Forbidden from https://upload.pypi.org/legacy/
Invalid or non-existent authentication information. See https://pypi.org/help/#invalid-auth for more information.
用户密码错误
3、HTTPError: 400 Bad Request from https://upload.pypi.org/legacy/
User ‘xxx’ does not have a verified primary email address. Please add a verified primary email before attempting to upload to PyPI. See https://pypi.org/help/#verified-email for more information.
自己账号的主邮箱没有验证,看看自己邮箱有没有pypi发来的邮件