python项目模块打包本地发布并上传到到PyPI官网

发布时间 2024-01-06 13:45:27作者: 无渊

前言

为什么打包源码
如果你想让你的实现的python代码,通过pip install 的方式供所有人进行下载;那就需要将代码上传到PyPi上,这样才能让所有人使用;

前提

  • 有一个pypi官网账号
    正式注册地址
    测试注册地址
  • 新增token
    注册成功后,我们需要生成token用于上传pypi,注册成功登录后,需要从用户名点击,选择【Account Settings】
    image
    往下滑,找到【API tokens】
    image
    点击后,输入Token名称,和选择Token范围

image

完成后,点击【Add token】 就可以了。

完成后,会得到一个很长的以pypi-开头的token,请记住它,后面要用。

至此,生成token已经结束了。

操作步骤

第一步,创建本地目录结构

工程_name/
└── src/
    └── project_name/
        ├── __init__.py
        └── dlt.py

以上除了src和__init__.py为固定值,其他都可以自定义;目录结构需保持一致;
其中__init__.py是为了将目录作为包导入,默认可以为空。 dlt.py是包中的一个模块,主要是提供的功能供下载人调用

第二步:创建上传所需的文件

最终得文件结构如下:

工程_name/
├── LICENSE
├── pyproject.toml
├── README.md
├── setup.py
├── src/
│   └── project_name/
│       ├── __init__.py
│       └── dlt.py

文件说明文件说明

  1. pyproject.toml
    告诉构建工具构建项目所需的内容。
    pyproject.toml并输入以下内容:
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
  1. README.md 是包的描述信息,markdown格式书写;
# easytest
`easytest`是一个接口自动化框架。

功能特点:

- 支持http接口测试
- 支持`json`,`html`,`xml`格式的响应断言
- 支持数据库断言
- 支持用例标记筛选
- 支持用例失败重运行
- 支持多线程
  1. setup.py
    是setuptools的构建脚本。它告诉 setuptools 您的包(例如名称和版本)以及要包含的代码文件。
    打开setup.py并输入以下内容。更改name 以包含您的用户名;这可确保您拥有唯一的包名称,并且您的包不会与其他人按照本教程上传的包冲突。

内容为:

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="easytest_zgys",
    version="1.0.1",
    author="ZZL",
    url='https://gitee.com/zhaoziliqr/easytest_test.git',
    author_email="1778552868@qq.com",
    description="easytest_zgys测试平台执行引擎",
    long_description=long_description,
    long_description_content_type="text/markdown",
    package_dir={"": "src"},
    packages=setuptools.find_packages(where="src"),
    python_requires=">=3.6",
)

部分属性说明

  • name是您的包的分发名称。这可以是任何名称;
  • version是包版本。
  • author并author_email用于标识包的作者。
  • description是一个简短的、一句话的包摘要。
  • long_description是包的详细说明。
  • long_description_content_type: 描述使用什么类型的标记。
  • url是项目主页的 URL。可不写。
  • project_urls 显示的任意数量的链接。通常是文档、问题跟踪器等。
  • package_dir是一个字典,src目录被指定为根包。
  • packages 包含在分发包中的所有 Python导入包的列表;
  • python_requires给出项目支持的 Python 版本。
    还有有个配置文件setup.cfg,相对于setup.py,此文件配置是静态元数据,内容基本不变;推荐使用setup.py配置; 具体可参考pypi官网解释;
  1. LICENSE是许可文件,参考以下输入既可
  • 不用改,直接复制使用
Copyright (c) 2018 The Python Packaging Authority

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.

5.注意:项目的真实目录格式

上面说的是只有一个函数的情况,实际我们会上传项目下的好多文件,包等格式看我真实的怎么样的
image
按以上的格式写就行了,其他的build,dist文件等不用管,后面都会生成的

6.本地安装模块

python setup.py build   # build可以省略

python setup.py sdist   ## dist目录下生成了最终的压缩包(默认格式tar.gz),可以指定压缩包类型通过指定参数  --formats=zip,gztar...  参考链接:https://docs.python.org/3.7/distutils/sourcedist.html

cd dist

解压:tar -zxvf **.tar.gz   # 也可以不解压,通过easy_install 来直接安装,ps:通过easy_install安装的卸载相对麻烦些

python setup.py build   # build可以省略

python setup.py install # 安装模块

python setup.py develop # 调试模式,不会真正安装,生成一个软链接,这边更新以后,导入的包会随之更新,方便调试

  • 安装成功后,进入 python 工程目录:env/Lib/site-packages 目录(第三方模块都安装的这里,python 解释器执行时也会搜索这个路径
    image

7.上传

  1. 典型的 .pypirc 文件

可以配置到$HOME/.pypirc文件中,就不用多次输入了。window: C:\Users\用户名.pypirc
文件内容为:

[distutils]
index-servers=pypi
[pypi]
# 测试环境的地址
repository = https://test.pypi.org/legacy/
username = __token__
password =xxxx
  1. 备注
这里的username和password是上面我们新增的toekn输入的值,这里好处就是安全,也可以直接使用我们pypi的账号和密码,这样有可能会暴漏自己的密码,另外我试过现在pypi要求我们要使用token的形式进行上传,使用密码的话会提示账号密码无效类似的提示语,这里强烈建议使用token的形式。

1.上传方式1-不推荐,用户密码容易被劫持

[distutils]
index-servers = pypi

[pypi]
repository = https://upload.pypi.org/legacy/ # 正式平台
username:xxx
password:xxx

[pypitest]
repository: https://test.pypi.org/legacy/  # 测试平台
username: your_username
password: your_password

# 然后使用这条命令进行信息注册,完成后,你可以在 PyPi 上看到项目信息。
python setup.py register

# 注册完了后,你还要上传源码包,别人才使用下载安装
python setup.py upload  # 默认上传到正式平台
python setup.py upload -r pypi  # 正式平台
python setup.py upload -r pypitest  # 测试平台
python setup.py sdist upload -r pypi # 一步创建发布

2.上传方式2,推荐

pypi官网:https://pypi.org/
使用 twine 上传自己的 python 包到 pypi

# 安装twine
pip install twine

# 打包检查
python setup.py check

# 打包
python setup.py sdist build

# 上传
twine upload dist/*

# .pypirc文件下面内容如下
[distutils]
index-servers = pypi
[pypi]
#测试环境
repository = https://test.pypi.org/legacy/
username:xxx
password:xxx

# 下载安装
pip install name  # name是setup里面name对应的名字

上传过程成功结果图
image

8.上传完成,我们可以去pypi官网进行查看

image

9.注意事项

很重要
这里有几个细节可以注意一下,当我们打包后,会得到一个dist目录,在该目录下,有一个结尾为.whl的文件,我们可以直接通过pip install 跟上文件名来安装一下包,若包没问题后,我们就可以上传到pypi了。还有pypi有一个很严格的措施,为了安全,pypi不允许重复使用项目,即使该项目被删除了并再次上传也不行,这是要方式项目被恶意更改,所以删除就再也不存在该项目了,还有一点,如果只是测试上传pypi,请使用test.pypi.org。

10.上传到正式环境

如果你已经测试完成了,可以上传到正式环境了,只要再.pypirc文件下面内容如下:

[distutils]
index-servers = pypi
[pypi]
#正式环境
repository = https://upload.pypi.org/legacy/
username:xxx
password:xxx