1. PyPi的用途
Python中我們經常會用到第三方的包惯裕,默認情況下,用到的第三方工具包基本都是從Pypi.org里面下載。
我們舉個栗子: 如果你希望用Python實現一個金融量化分析工具,目前比較好用的金融數據來源是 Yahoo 和 Google童叠。
你可能需要讀取這 2 個平臺的 API,然后依次實現下載课幕、分析數據的代碼厦坛。
是不是好麻煩,這樣你可以到 PyPi 到上面去找找有沒有已經寫過這個內容乍惊,幸運的是杜秸,你真找到了,你找到了一個 package 叫做 yfinance
润绎。
https://github.com/ranaroussi/yfinance
這個時候你只需要一個命令,免除了我們從頭實現的麻煩:
pip install yfinance
就可以了撬碟,是不是非常方便。
PyPI
是 Python Package Index 的首字母簡寫莉撇,其實表示的是 Python 的 Packag 索引呢蛤,這個也是 Python 的官方索引。
需要先再本地環(huán)境安裝pip棍郎,然后如果要安裝其他工具包的話就使用指令:
pip install <package name>
官方地址:https://pypi.org/
一句話解釋:如果你使用的是 Java 項目的話顾稀,你就將 PyPi 理解成 Maven 就行了。
那我們如何將自己開發(fā)的一個包上傳到PyPI坝撑,供其它人使用呢静秆。
2.Python包發(fā)布步驟
下面就開始介紹如何將自己的Python項目發(fā)布到PyPI
2.1 創(chuàng)建目錄結構
創(chuàng)建一個測試項目粮揉,例如project_demo
,在該項目下,創(chuàng)建一個待發(fā)布的包目錄抚笔,例如:package_mikezhou_talk
扶认,并在該project_demo
目錄下,依次創(chuàng)建:setup.py
殊橙、LICENSE
交掏、README.rst
幾項文件彼乌,此時目錄結構為:
? project_demo tree -L 2
.
├── LICENSE
├── README.rst
├── package_mikezhou_talk
│ └── __init__.py
└── setup.py
1 directory, 4 files
2.2 準備文件
接下來我們來逐一編寫除了代碼以外的文件破花。
1竖慧、README.rst
是關于項目的描述文件,一般包含怎樣安裝項目敞葛,怎樣使用項目等誉察。markdown 語法可以參考 https://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html
打開README.rst并輸入以下內容∪切常可以自定義此項持偏,放入一些對項目的介紹。
# Example Package
This is a simple example package. You can use
[聯系作者](https://mp.weixin.qq.com/s/9FQ-Tun5FbpBepBAsdY62w)
to write your content.
2氨肌、LICENSE.txt鸿秆,創(chuàng)建許可證
上傳到Python Package Index的每個包都包含許可證,這一點很重要怎囚。這告訴用戶安裝你的軟件包可以使用您的軟件包的條款卿叽。
開源License,有如MIT恳守,Apache license 2.0等附帽。有關選擇許可證的幫助,請訪問https://choosealicense.com/
井誉。選擇許可證后,打開 LICENSE并輸入許可證文本整胃。
3颗圣、setup.py文件
setup.py是setuptools的構建腳本,用來描述項目屁使,打包的時候會用到這個文件在岂。它告訴PyPI我們的項目叫什么名字,是什么版本蛮寂,依賴哪些庫蔽午,支持哪些操作系統,可以在哪些版本的Python上運行酬蹋,等等及老。
標準腳本示例:
from distutils.core import setup
from setuptools import find_packages
with open("README.rst", "r") as f:
long_description = f.read()
setup(name='package_mikezhou_talk', # 包名
version='1.0.0', # 版本號
description='A small example package',
long_description=long_description,
author='mikezhou_talk',
author_email='762357658@qq.com',
url='https://mp.weixin.qq.com/s/9FQ-Tun5FbpBepBAsdY62w',
install_requires=[],
license='BSD License',
packages=find_packages(),
platforms=["all"],
classifiers=[
'Intended Audience :: Developers',
'Operating System :: OS Independent',
'Natural Language :: Chinese (Simplified)',
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Topic :: Software Development :: Libraries'
],
)
重要參數說明:
- name:項目的名稱抽莱,name是包的分發(fā)名稱。
- version:項目的版本骄恶。需要注意的是食铐,PyPI上只允許一個版本存在,如果后續(xù)代碼有了任何更改僧鲁,再次上傳需要增加版本號
- author和author_email:項目作者的名字和郵件, 用于識別包的作者虐呻。
- description:項目的簡短描述
- long_description:項目的詳細描述,會顯示在PyPI的項目描述頁面寞秃。必須是rst(reStructuredText) 格式的
- packages:指定最終發(fā)布的包中要包含的packages斟叼。
- install_requires:項目依賴哪些庫,這些庫會在pip install的時候自動安裝
- classifiers:其他信息春寿,一般包括項目支持的Python版本朗涩,License,支持的操作系統堂淡。
克隆setup.py倉庫(推薦)
如果你覺得手寫setup.py
腳本文件難度大太馋缅,給你推薦另外一個簡易方法。
大名鼎鼎的requests庫的作者大神kennethreitz為大家準備了一個倉庫作為一個setup.py的很好的模板绢淀,當然你也可以自己手寫setup.py萤悴。
git clone https://github.com/kennethreitz/setup.py
建議大家直接編輯之前的倉庫里的setup.py, 只需要修改一些必要的配置就可以了皆的。
2.3 編寫核心代碼
接下來我們就可以編寫自己的代碼了覆履,要注意源代碼文件夾(倉庫里的package_mikezhou_talk
包目錄)的名字與setup.py里配置的包名(Name)要一致。
這一部內容费薄,就根據各自的需求硝全,自行實現即可。
例如:我在示例package_mikezhou_talk
包目錄下楞抡,新建了一個main.py文件伟众,在該文件下實現待實現的功能。
示例:
import itertools
case_list = ['用戶名', '密碼']
value_list = ['正確', '不正確', '特殊符號', '超過最大長度']
def gen_case(item=case_list, value=value_list):
'''輸出笛卡爾用例集合'''
for i in itertools.product(item, value):
print('輸入'.join(i))
def test_print():
print("歡迎搜索關注公眾號: 「測試開發(fā)技術」!")
if __name__ == '__main__':
test_print()
2.4 生成分發(fā)檔案
下一步是為包生成分發(fā)包召廷。這些是上傳到包索引的檔案凳厢,可以通過pip安裝。
確保您擁有setuptools并wheel 安裝了最新版本:
python3 -m pip install --user --upgrade setuptools wheel
生成這前竞慢,可以先運行python setup.py check
檢查setup.py是否有錯誤先紫,如果沒報錯誤,則進行下一步輸出一般是running check筹煮。
1遮精、準備好上面的步驟, 一個包就基本完整了, 剩下的就是打包了,可以使用下面命令打包一個源代碼的包:
python setup.py sdist build
這樣在當前目錄的dist文件夾下, 就會多出一個tar.gz結尾的包了:
2败潦、也可以打包一個wheels格式的包, 使用下面的命令就可以了:
python setup.py bdist_wheel --universal
這樣會在dist文件夾下面生成一個whl文件.
3本冲、或者從setup.py位于的同一目錄運行此命令:
python3 setup.py sdist bdist_wheel
上面的命令會在dist目錄下生成一個tar.gz的源碼包和一個.whl的Wheel包准脂。
2.5 發(fā)布包到PyPi
1、接下來就是去https://pypi.org/account/register/
注冊賬號眼俊,如果有賬號的請忽略意狠,記住你的賬號和密碼,后面上傳包會使用疮胖。
2环戈、接下來就是上傳你的包了,這里使用twine上傳澎灸。
需要先安裝twine(用 twine上傳分發(fā)包院塞,并且只有 twine> = 1.11.0 才能將元數據正確發(fā)送到 Pypi上)
pip install twine
3、安裝完之后性昭,運行下面的命令將庫上傳拦止,上傳包,期間會讓你輸入注冊的用戶名和密碼
twine upload dist/*
輸入 PyPI注冊的用戶名和密碼糜颠。命令完成后汹族,您應該看到與此類似的輸出:
? twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your username: mikezhou_talk
Enter your password:
Uploading package_mikezhou_talk-1.0.0-py3-none-any.whl
100%|██████████████████████████████████████| 7.84k/7.84k [00:03<00:00, 2.29kB/s]
Uploading package_mikezhou_talk-1.0.0.tar.gz
100%|██████████████████████████████████████| 6.64k/6.64k [00:01<00:00, 6.05kB/s]
View at:
https://pypi.org/project/package-mikezhou-talk/1.0.0/
上傳完成后,我們的項目就成功地發(fā)布到PyPI了其兴。
3.驗證發(fā)布PYPI成功
上傳完成了會顯示success,我們直接可以在PyPI上查看顶瞒,如下:
您可以使用pip來安裝包并驗證它是否有效。 創(chuàng)建一個新的virtualenv (請參閱安裝包以獲取詳細說明)并從TestPyPI安裝包:
python3 -m pip install --index-url https://test.pypi.org/simple/ package-mikezhou-talk
或
pip install package-mikezhou-talk -i https://www.pypi.org/simple/
如下圖所示:
進入Python Shell驗證結果如下:
至此元旬,我們已經成功地將自己開發(fā)的Python程序發(fā)布到了PyPI榴徐,此時你,可以直接在你本地的環(huán)境通過pip命令安裝示例中的package-mikezhou-talk
這個包了匀归。
官網地址:
https://pypi.org/project/package-mikezhou-talk/1.0.0/