1. 程式人生 > >實戰教程:如何將自己的Python包釋出到PyPI上

實戰教程:如何將自己的Python包釋出到PyPI上

# 1. PyPi的用途 Python中我們經常會用到第三方的包,預設情況下,用到的第三方工具包基本都是從Pypi.org裡面下載。 **我們舉個栗子:** 如果你希望用Python實現一個金融量化分析工具,目前比較好用的金融資料來源是 Yahoo 和 Google。 你可能需要讀取這 2 個平臺的 API,然後依次實現下載、分析資料的程式碼。 是不是好麻煩,這樣你可以到 PyPi 到上面去找找有沒有已經寫過這個內容,幸運的是,你真找到了,你找到了一個 package 叫做 `yfinance`。 ``` https://github.com/ranaroussi/yfinance ``` 這個時候你只需要一個命令,免除了我們從頭實現的麻煩: ``` pip install yfinance ``` 就可以了,是不是非常方便。 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gkz2d86oatj32360sgwhi.jpg) `PyPI` 是 Python Package Index 的首字母簡寫,其實表示的是 Python 的 Packag 索引,這個也是 Python 的官方索引。 需要先再本地環境安裝pip,然後如果要安裝其他工具包的話就使用指令: ``` pip install ``` 官方地址:`https://pypi.org/` 一句話解釋:**如果你使用的是 Java 專案的話,你就將 PyPi 理解成 Maven 就行了。** 那我們如何將自己開發的一個包上傳到PyPI,供其它人使用呢。 # 2.Python包釋出步驟 下面就開始介紹如何將自己的Python專案釋出到PyPI ## 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 準備檔案 接下來我們來逐一編寫除了程式碼以外的檔案。 **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,建立許可證** 上傳到Python Package Index的每個包都包含許可證,這一點很重要。這告訴使用者安裝你的軟體包可以使用您的軟體包的條款。 開源License,有如MIT,Apache license 2.0等。有關選擇許可證的幫助,請訪問`https://choosealicense.com/`。選擇許可證後,開啟 LICENSE並輸入許可證文字。 ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gkz314xoi1j31hw0u0gry.jpg) **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='[email protected]', 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。 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 釋出包到PyPi 1、接下來就是去`https://pypi.org/account/register/`註冊賬號,如果有賬號的請忽略,記住你的賬號和密碼,後面上傳包會使用。 2、接下來就是上傳你的包了,這裡使用twine上傳。 需要先安裝twine(用 twine上傳分發包,並且只有 twine> = 1.11.0 才能將元資料正確傳送到 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/ ``` 上傳完成後,我們的專案就成功地釋出到PyPI了。 # 3.驗證釋出PYPI成功 上傳完成了會顯示success,我們直接可以在PyPI上檢視,如下: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gkz59ev912j319s0u0tft.jpg) 您可以使用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/ ``` 如下圖所示: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gkz5dg4u15j30k003dt98.jpg) 進入Python Shell驗證結果如下: ![](https://tva1.sinaimg.cn/large/0081Kckwgy1gkz5hjqb7ej30oc09h75p.jpg) 至此,我們已經成功地將自己開發的Python程式釋出到了PyPI,此時你,可以直接在你本地的環境通過pip命令安裝示例中的`package-mikezhou-talk`這個包了。 **官網地址:** ``` https://pypi.org/project/package-mikezhou-talk/1.0