天天看點

實戰教程:如何将自己的Python包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出PYPI成功

1. PyPi的用途

Python中我們經常會用到第三方的包,預設情況下,用到的第三方工具包基本都是從Pypi.org裡面下載下傳。

我們舉個栗子: 如果你希望用Python實作一個金融量化分析工具,目前比較好用的金融資料來源是 Yahoo 和 Google。

你可能需要讀取這 2 個平台的 API,然後依次實作下載下傳、分析資料的代碼。

是不是好麻煩,這樣你可以到 PyPi 到上面去找找有沒有已經寫過這個内容,幸運的是,你真找到了,你找到了一個 package 叫做

yfinance

https://github.com/ranaroussi/yfinance           

這個時候你隻需要一個指令,免除了我們從頭實作的麻煩:

pip install yfinance           

就可以了,是不是非常友善。

實戰教程:如何将自己的Python包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出PYPI成功

PyPI

是 Python Package Index 的首字母簡寫,其實表示的是 Python 的 Packag 索引,這個也是 Python 的官方索引。

需要先再本地環境安裝pip,然後如果要安裝其他工具包的話就使用指令:

pip install <package name>           

官方位址:

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并輸入許可證文本。

實戰教程:如何将自己的Python包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出PYPI成功

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上檢視,如下:

實戰教程:如何将自己的Python包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出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包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出PYPI成功

進入Python Shell驗證結果如下:

實戰教程:如何将自己的Python包釋出到PyPI上1. PyPi的用途2.Python包釋出步驟3.驗證釋出PYPI成功

至此,我們已經成功地将自己開發的Python程式釋出到了PyPI,此時你,可以直接在你本地的環境通過pip指令安裝示例中的

package-mikezhou-talk

這個包了。

官網位址:

https://pypi.org/project/package-mikezhou-talk/1.0.0/