目录
Python之所以流行,不仅是因为其强大的功能和广泛的应用领域,还因为拥有一个庞大的社区和丰富的第三方库资源。对于Python开发者来说,将自己开发的项目上传到Python Package Index(PyPI)上,可以让更多的用户使用pip命令就可以轻松使用你的代码。
最近在做项目,顺手便写下了这篇文章,用来记录一下我自己的python项目的开发经历以及过程中的各种要点,当然主要还是介绍一下上传项目至pypi的方法
pip命令
Pip是python中一个非常强大的包管理工具,它允许用户从Python包索引(PyPI)安装、升级和管理Python包。通过使用Pip命令,用户可以轻松地安装所需的第三方库和框架,这些库和框架可以极大地扩展Python的功能和应用范围。此外,Pip还支持包的版本管理,用户可以指定安装特定版本的包,以确保代码的兼容性和稳定性。
一些常见的pip命令
下载某个库
pip install 库名
更新某个库
pip install --upgrade 库名
卸载某个库
pip uninstall 库名
获得关于某个库的信息摘要
pip show 库名
由于 python 自带的源下载速度非常慢,特别是安装一些库的时候,甚至有时会失败。因此,建议将下载源替换成国内的,这样下载速度会快很多。
将镜像源网址设定为pip下载库时的默认路径,设定后再使用pip install命令下载库时速度就会快很多了。
#设定阿里云镜像源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple
pip config set install.trusted-host mirrors.aliyun.com
#设定清华大学镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip config set install.trusted-host pypi.tuna.tsinghua.edu.cn
项目上传
1.PyPi注册账号以及获取Api tokens
我们要想将自己的项目上传到pypi官网上,是需要一个账号以及API tokens的,点击下方链接即可前往pypi官网:
https://pypi.org/https://pypi.org/
点击Register
输入个人信息,注册账号
登录后点击Account settings,滑至底部,找到API tokens选项
点击添加Add token
2FA验证
这里要注意,若你还没有经过2FA验证,可能还无法使用该功能,PyPi会要求你经过2FA验证后才可以账号登录以及正常使用该功能,对于2FA验证,这里推荐一个网站
https://2fa.run/https://2fa.run/
2FA验证网站
在该网站内,点击获取验证码按钮后即可获取到一个六位数字的2FA验证码,复制后将其粘贴到验证码输入框,点击确认后即可通过2FA验证,任何需要使用2FA验证的网址(github;pypi)都可以使用这个网站内的2FA验证通过。
接着创建API token
输入你的Api token的名字,一般是你要上传的项目的名字即可。
Scope选项说明:
Scope选项是指你这次新建的Api token的使用范围,由于我已经创建过项目了,所以会要求我选择使用范围,一般默认Entire account(all projects)就可以,这个选项是指新建的这个API token可以用来上传你账号内所有的项目而不是单一的项目。
点击Create token创建成功后会弹出一串密码,这个密码要复制好,妥善保存,接下来我们会用到。
2.配置.pypirc文件
pypirc文件内容
[distutils]
inedx-servers=pypi
[pypi]
repository=https://upload.pypi.org/legacy/
username=__token__
password=pypi-刚刚生成的密码
配置好后将文件名命名为.pypirc并将其放置在C盘用户文件夹下,即:输入cmd命令后Users后边的那个文件夹
这里要注意的是 pypirc文件非windows系统内置文件,因此右键新建无法直接创建,这里我们可以使用vscode的新建文件功能,在vscode打开一个文件夹后我们可以在文件夹内直接新建文件且支持自定义文件后缀名,然后再将该文件移动到用户文件夹下就ok了。
到这儿,我们的前期准备工作便完毕了,接下来就是项目的上传了。
3.本地项目配置
项目结构
对于python的package,也就是我们常说的库,在上传时我们上传的实际是一个至少包含若干py文件当然也可能包含其他类型文件比如.cpp,makefile等的文件夹。
一般来说python package文件夹外与其同级的是setup.py, setup.cfg,README.md这个三个文件,并且你的package内还必须要有__init__.py这个文件。
一些其他的库比如pandas,不只是用python一种语言构成,可能包含其他类型的文件,但是,无论如何,即使你整个项目是使用c语言完成,你想要将其上传到pypi给python用户调用,你还是得写一个py接口在内部来调用C语言代码,以及一个_init_.py来让setuptools可以定位到你的python package,所以这也是为什么前边提到你的项目中一定是至少包函若干py文件。
pywechat项目结构
这是一个python含量100%的项目,也是一个一般通用的python项目结构,pywechat是我待上传的package文件夹,其内部包含许多py脚本,用户使用pip install 命令获取我的package时,需使用setup.py内指定的package name这里是pywechat127,接着便会下载一个pywechat127.egg的二进制包到python的lib文件夹中,这个egg文件内包含我们上传的pywechat文件夹,因此用户在下载库时是:
pip install pywechat127
在代码中调用时却是:
import pywechat.WechatAuto as wechat
这一问题我们会在之后的项目命名规范中谈到。
__init__.py文件说明
__init__.py是一个python项目文件夹中必须有的py文件,他决定了setupTools的find_packages函数是否能找到你的项目文件夹,它的主要作用就是让find_packages函数定位哪个文件夹是你要上传的项目,这个py文件内部可以什么都没有,也可以写一写关于整个库的一些基本信息,使用教程等,这样用户在对你的库使用help函数后输出的内容便是__init__,py中的所有内容
pywechat __init__.py内容
使用help函数
特别的,在你写完__init_.py的内容后,若你的IDE是vscode或pycharm那么将你的鼠标移动到代码中的库名上之后你便可以看到:
下载上传工具
在上传项目时,我们需要用到两个工具,setuptools,twine
这两个工具使用pip命令即可获取:
pip install setuptools
pip install twine
setup.py配置
setup.py内容
from setuptools import setup,find_packages
setup(name='pywechat127',
version='1.8.3',
author='Hello-Mr-Crab',
author_email='一串数字@qq.com',
description=f'A Powerful Windows-PC-Wechat automation Tool',
long_description=open('README.md','r',encoding='utf-8').read(),
long_description_content_type='text/markdown',
url='https://github.com/Hello-Mr-Crab/pywechat',
packages=find_packages(),
license='Apache-2.0',
keywords=['rpa','windows','wechat','automation'],
install_requires=[
'PyAutoGUI>=0.9.54','pycaw>=20240210','pywin32>=308','pywin32-ctypes>=0.2.2','pywinauto>=0.6.8','psutil>=5.9.6','pillow>=11.1.0']
)
#name:用户使用pip命令安装时你的库的名字,文件夹是的名字是用户在代码调用你的库的名字
#version:package的版本号
#autoor:作者名称(非必须)
#author_email:作者email地址(非必须)
#descriptoion:一段简介明了的介绍,几十字就可以了。
#long_description:这里推荐你将项目的readme.md文件直接作为long_description,并且你可以先在#github内写好后下载到本地,接着使用open语句读取
#url:项目的链接,若你有能力可以为该项目自己搭建一个简介网站,若没有能力老老实实在github上上传项目之后把链接放到这里即可(非必须)
#packages:使用find_packages()函数即可。
#license:我这里选择的是Apache-2.0
#keywords:关键字
#install_requires:你的项目中用到的别人的库,全部以List[str]的形式写在这里,这里推荐使用库名>=版本号的格式
setup.cfg文件
[metadata]
description_file=README.MD
setup.cfg文件配置很简单,只需两行代码即可搞定
命名规范说明
在上传项目时,有必要说明一下项目命名规范的问题。
python的package name只能包含英文与数字,并且英文单词是不区分大小写的(不信的话,你可以对一个已经下载的库同时运行pip show 小写英文单词库名 和pip show 大写英文单词库名,你会发现二者都可以显示出该库的信息)
python package name的反重复意识很强,只要别人的库名中包含你想要的名字的一部分,那么,抱歉,你的这个名字无法使用,请更换名字。
这是在pypi搜索pywechat(我一开始想要使用的库名)的结果,最顶层的库是我最近上传的,因为pywechat这个package name是别人已经之前用到过的,虽然没有一个库的名字与pywechat一模一样,但是直接使用pywechat作为我的package name就是不可以,所以,无奈我只能在pywechat后加一个127数字,来继续坚持使用这个名字。注意,这里的package name是我们在setup.py中的package name,若你坚持使用原来的库名,你可以将上传的文件夹保留原来库名,setup.py中共的package name命名为其他名字
比如最常见的cv2,我们使用pip命令下载时库名是opencv-python
pip install opencv-python
但是我们在使用时,调用的却是
import cv2
造成这一现象的原因就是上边说到的setup.py中的package name与上传的文件夹名称不一致导致的,总的来说就是setup.py内的package name是使用pip命令下载这个库时需要用到的名字,而文件夹的名字是我们在代码中调用时库的名字。
上传package到pypi
接下来,我们运行这两个命令后便可以上传我们的项目至pypi,以供其他用户使用pip命令使用你的库了
首先在项目的终端内,运行命令:
python setup.py sdist bdist_wheel
运行后将会在项目同级文件夹内生成一个dist文件夹
接着我们再运行命令:
twine upload dist/*
然后便上传项目至pypi了,这时你可以登录pypi官网查看和管理你的项目了。
关于python package版本号的一些说明
经过上边的所有步骤,你已经上传了自己的package至pypi,当我们需要修改项目的源代码的时候要注意,python只接受上传新版本号的package,不支持修改原来版本号的package后重复上传,也就是说,当你想要修复原来上传过的package内的内容时你必须修改setup.py中的version,然后再上传,这实际上算是更新......