如何將自己的Python包發(fā)布到PyPI上

1. PyPi的用途

Python中我們經常會用到第三方的包惯裕,默認情況下,用到的第三方工具包基本都是從Pypi.org里面下載。

我們舉個栗子: 如果你希望用Python實現一個金融量化分析工具,目前比較好用的金融數據來源是 Yahoo 和 Google童叠。
你可能需要讀取這 2 個平臺的 API,然后依次實現下載课幕、分析數據的代碼厦坛。
是不是好麻煩,這樣你可以到 PyPi 到上面去找找有沒有已經寫過這個內容乍惊,幸運的是杜秸,你真找到了,你找到了一個 package 叫做 yfinance润绎。

https://github.com/ranaroussi/yfinance

這個時候你只需要一個命令,免除了我們從頭實現的麻煩:

pip install yfinance

就可以了撬碟,是不是非常方便。

image

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

image

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上查看顶瞒,如下:

image

您可以使用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/

如下圖所示:


image

進入Python Shell驗證結果如下:


image

至此元旬,我們已經成功地將自己開發(fā)的Python程序發(fā)布到了PyPI榴徐,此時你,可以直接在你本地的環(huán)境通過pip命令安裝示例中的package-mikezhou-talk這個包了匀归。

官網地址:

https://pypi.org/project/package-mikezhou-talk/1.0.0/
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末坑资,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子穆端,更是在濱河造成了極大的恐慌袱贮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件体啰,死亡現場離奇詭異攒巍,居然都是意外死亡,警方通過查閱死者的電腦和手機狡赐,發(fā)現死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钦幔,“玉大人枕屉,你說我怎么就攤上這事±鹎猓” “怎么了搀擂?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵西潘,是天一觀的道長。 經常有香客問我哨颂,道長喷市,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任威恼,我火速辦了婚禮品姓,結果婚禮上,老公的妹妹穿的比我還像新娘箫措。我一直安慰自己腹备,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布斤蔓。 她就那樣靜靜地躺著植酥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弦牡。 梳的紋絲不亂的頭發(fā)上友驮,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音驾锰,去河邊找鬼卸留。 笑死,一個胖子當著我的面吹牛稻据,可吹牛的內容都是我干的艾猜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捻悯,長吁一口氣:“原來是場噩夢啊……” “哼匆赃!你這毒婦竟也來了?” 一聲冷哼從身側響起今缚,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤算柳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姓言,有當地人在樹林里發(fā)現了一具尸體瞬项,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年何荚,在試婚紗的時候發(fā)現自己被綠了囱淋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡餐塘,死狀恐怖妥衣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤税手,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布蜂筹,位于F島的核電站,受9級特大地震影響芦倒,放射性物質發(fā)生泄漏艺挪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一兵扬、第九天 我趴在偏房一處隱蔽的房頂上張望麻裳。 院中可真熱鬧,春花似錦周霉、人聲如沸掂器。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽国瓮。三九已至,卻和暖如春狞谱,著一層夾襖步出監(jiān)牢的瞬間乃摹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工跟衅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孵睬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓伶跷,卻偏偏與公主長得像掰读,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叭莫,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容