0x01、簡介
The Python Package Index, abbreviated as PyPI and also known as the Cheese Shop (a reference to the Monty Python's Flying Circus sketch Cheese Shop),[1][2] is the official third-party software repository for Python.[3] It is analogous to CPAN, the repository for Perl.[4] Some package managers, including pip, use PyPI as the default source for packages and their dependencies.[5][6] Over 113,000 Python packages can be accessed through PyPI.[7]
就是說PyPI(Python Package Index)是Python官方的第三方庫,所有人都可以下載或上傳Python庫到PyPI。
0x02、流程
1、注冊賬號
想要上傳自己的Python包沒PyPI賬號怎么行!官網(wǎng)地址
2、項目架構
1、項目環(huán)境:
- python3
- pip
- setuptools
- wheel
- twine
2、項目文件
如果想上傳一個名為 "debug_world" 的Python包,那么她的項目文件如下:
-- packaging_tutorial # 項目名字
-- debug_world # 包名字
-- __init__.py # 一定要有init文件
-- print_str.py # 功能實現(xiàn)
-- __init__.py # 一定要有init文件
-- README.md # 一般記錄具體使用方法
-- setup.py # 打包程序
print_str.py文件實現(xiàn)三個功能,代碼如下:
def debug_world():
print('世界很美好,我去如此暴躁,這樣不好不好')
def hello_world():
print('Hello, world')
def hello_python():
print('Hello Python\nPython 大法好')
setup.py文件代碼如下:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="debug-world", # 包的分發(fā)名稱,使用字母、數(shù)字、_、-
version="0.0.1", # 版本號, 版本號規(guī)范:https://www.python.org/dev/peps/pep-0440/
author="liheyou", # 作者名字
author_email="author@example.com", # 作者郵箱
description="PyPI Tutorial", # 包的簡介描述
long_description=long_description, # 包的詳細介紹(一般通過加載README.md)
long_description_content_type="text/markdown", # 和上條命令配合使用,聲明加載的是markdown文件
url="https://github.com/", # 項目開源地址,我這里寫的是同性交友官網(wǎng),大家可以寫自己真實的開源網(wǎng)址
packages=setuptools.find_packages(), # 如果項目由多個文件組成,我們可以使用find_packages()自動發(fā)現(xiàn)所有包和子包,而不是手動列出每個包,在這種情況下,包列表將是example_pkg
classifiers=[ # 關于包的其他元數(shù)據(jù)(metadata)
"Programming Language :: Python :: 3", # 該軟件包僅與Python3兼容
"License :: OSI Approved :: MIT License", # 根據(jù)MIT許可證開源
"Operating System :: OS Independent", # 與操作系統(tǒng)無關
],
install_requires=['pymysql>=0.10.0', 'retrying==1.3.3', 'xlrd>=1.2.0', 'openpyxl>=3.0.5'], # 依賴的包
python_requires='>=3'
)
# 這是最簡單的配置
# 有關詳細信息,請參閱(https://packaging.python.org/guides/distributing-packages-using-setuptools/)
這里是最簡單的配置,有關詳細信息,請參閱打包和分發(fā)項目。
3、本地打包
確保pip,setuptools和wheel是最新的。
雖然pip就能夠保證安裝成功,但是最新的setuptools和wheel對安裝有益無害。
While pip alone is sufficient to install from pre-built binary archives, up to date copies of the setuptools and wheel projects are useful to ensure you can also install from source archives:
python -m pip install --upgrade pip setuptools wheel
進入setup.py同級目錄,然后運行打包程序
# 運行setup.py
python setup.py sdist
# 或者
python setup.py sdist bdist_wheel
此時項目會出現(xiàn)兩個新文件:
4、上傳PyPI
運行把Python包上傳到PyPI的命令
pip install twine # 如果已經(jīng)安裝twine,跳過次步驟
python -m twine upload dist/*
# 接著會讓你輸入PyPI用戶名和密碼,注意不是郵箱和密碼
# 出現(xiàn)下面信息說明成功,如有錯誤信息,檢查setup.py配置信息
Uploading distributions to https://upload.pypi.org/legacy/
Uploading debug-world-0.0.1.tar.gz
100%█████████████████████████| 5.56k/5.56k [00:01<00:00, 3.98kB/s]
如果不想每次上傳都輸入賬號和密碼,可以創(chuàng)建用戶驗證文件 ** ~/.pypirc**
# 而且此方法不安全,容易泄露密碼, 因為密碼是明文
[distutils]
index-servers =
pypi
[pypi]
repository: https://upload.pypi.org/legacy/
username: <username>
password: <password>
然后就可以去PyPI官網(wǎng)查看你的包是否成功上傳了
3、驗證
PyPI推薦通過pip使用Python包
pip install debug-world
新建驗證文件 verify_pypi.py
from debug_world import print_str
print(print_str.hello_world())
print(print_str.debug_world())
print(print_str.hello_python())
查看運行結果,說明成功了
Hello, world
世界很美好,我去如此暴躁,這樣不好不好
Hello Python Python 大法好
4、刪除版本
當想要刪除某一版本的時候,只需在官網(wǎng)項目管理頁面進行刪除即可。
輸入相對應的版本號。
0x03、注意事項
- 包名一定是別人沒用過的
- 項目文件一定要有** init.py**
- 運行setup.py文件一定要同級目錄
- 在上傳PyPI的是時候輸入的是用戶名和密碼,不是郵箱和密碼
- 上傳之后需要等一段時間,才能下載最新版本的包
- 更改包的時候一定要修改版本號
- pip 按照版本號安裝,==前后沒有空格
0x04、報錯
HTTPError: 400 Client Error: File already exists: 版本號錯誤
HTTPError: 403 Client Error: Invalid or non-existent authentication information: 密碼錯誤
error: invalid command 'bdist_wheel':
# 升級pip的安裝工具setuptools
sudo pip install --upgrade setuptools
# 然后更新包
python -m pip install --upgrade pip setuptools wheel