1. PyPi的用途
Python中咱們常常會用到第三方的包,默認狀況下,用到的第三方工具包基本都是從Pypi.org裏面下載。html
咱們舉個栗子: 若是你但願用Python實現一個金融量化分析工具,目前比較好用的金融數據來源是 Yahoo 和 Google。
你可能須要讀取這 2 個平臺的 API,而後依次實現下載、分析數據的代碼。
是否是好麻煩,這樣你能夠到 PyPi 到上面去找找有沒有已經寫過這個內容,幸運的是,你真找到了,你找到了一個 package 叫作 yfinance
。
python
https://github.com/ranaroussi/yfinance
這個時候你只須要一個命令,免除了咱們從頭實現的麻煩:git
pip install yfinance
就能夠了,是否是很是方便。github
PyPI
是 Python Package Index 的首字母簡寫,其實表示的是 Python 的 Packag 索引,這個也是 Python 的官方索引。
markdown
須要先再本地環境安裝pip,而後若是要安裝其餘工具包的話就使用指令:工具
pip install <package name>
官方地址:https://pypi.org/
測試
一句話解釋:若是你使用的是 Java 項目的話,你就將 PyPi 理解成 Maven 就好了。ui
那咱們如何將本身開發的一個包上傳到PyPI,供其它人使用呢。url
2.Python包發佈步驟
下面就開始介紹如何將本身的Python項目發佈到PyPIspa
2.1 建立目錄結構
建立一個測試項目,例如project_demo
,在該項目下,建立一個待發布的包目錄,例如:package_mikezhou_talk
,並在該project_demo
目錄下,依次建立: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 準備文件
接下來咱們來逐一編寫除了代碼之外的文件。
一、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.
二、LICENSE.txt,建立許可證
上傳到Python Package Index的每一個包都包含許可證,這一點很重要。這告訴用戶安裝你的軟件包可使用您的軟件包的條款。
開源License,有如MIT,Apache license 2.0等。有關選擇許可證的幫助,請訪問https://choosealicense.com/
。選擇許可證後,打開 LICENSE並輸入許可證文本。
三、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是包的分發名稱。
- version:項目的版本。須要注意的是,PyPI上只容許一個版本存在,若是後續代碼有了任何更改,再次上傳須要增長版本號
- author和author_email:項目做者的名字和郵件, 用於識別包的做者。
- description:項目的簡短描述
- long_description:項目的詳細描述,會顯示在PyPI的項目描述頁面。必須是rst(reStructuredText) 格式的
- packages:指定最終發佈的包中要包含的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("歡迎搜索關注公衆號: 「測試開發技術」!") if __name__ == '__main__': test_print()
2.4 生成分發檔案
下一步是爲包生成分發包。這些是上傳到包索引的檔案,能夠經過pip安裝。
確保您擁有setuptools並wheel 安裝了最新版本:
python3 -m pip install --user --upgrade setuptools wheel
生成這前,能夠先運行python setup.py check
檢查setup.py是否有錯誤,若是沒報錯誤,則進行下一步輸出通常是running check。
一、準備好上面的步驟, 一個包就基本完整了, 剩下的就是打包了,可使用下面命令打包一個源代碼的包:
python setup.py sdist build
這樣在當前目錄的dist文件夾下, 就會多出一個tar.gz結尾的包了:
二、也能夠打包一個wheels格式的包, 使用下面的命令就能夠了:
python setup.py bdist_wheel --universal
這樣會在dist文件夾下面生成一個whl文件.
三、或者從setup.py位於的同一目錄運行此命令:
python3 setup.py sdist bdist_wheel
上面的命令會在dist目錄下生成一個tar.gz的源碼包和一個.whl的Wheel包。
2.5 發佈包到PyPi
一、接下來就是去https://pypi.org/account/register/
註冊帳號,若是有帳號的請忽略,記住你的帳號和密碼,後面上傳包會使用。
二、接下來就是上傳你的包了,這裏使用twine上傳。
須要先安裝twine(用 twine上傳分發包,而且只有 twine> = 1.11.0 才能將元數據正確發送到 Pypi上)
pip install twine
三、安裝完以後,運行下面的命令將庫上傳,上傳包,期間會讓你輸入註冊的用戶名和密碼
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/
上傳完成後,咱們的項目就成功地發佈到PyPI了。
3.驗證發佈PYPI成功
上傳完成了會顯示success,咱們直接能夠在PyPI上查看,以下:
您可使用pip來安裝包並驗證它是否有效。 建立一個新的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驗證結果以下:
至此,咱們已經成功地將本身開發的Python程序發佈到了PyPI,此時你,能夠直接在你本地的環境經過pip命令安裝示例中的package-mikezhou-talk
這個包了。
官網地址:
https://pypi.org/project/package-mikezhou-talk/1.0.0/