創(chuàng)建并發(fā)布自己的python模塊

python通過模塊來共享組織代碼碰逸,python不僅內置了豐富的標準庫,而且python社區(qū)還貢獻了大量的第三方模塊阔加,正是由于第三方模塊大大擴展了python的應用領域饵史,成就了如今python的江湖地位。人人都可以向社區(qū)共享代碼胜榔,PyPI(Python Package Index)為第三方python模塊提供了一個集中的存儲庫胳喷,今天我們就來嘗試建立自己的模塊并發(fā)布到PyPI上。

以下內容在windows10系統(tǒng)下驗證OK夭织,其他系統(tǒng)應該差別不大吭露,linux系統(tǒng)python3版本需要將python命令替換為python3

創(chuàng)建模塊

所謂模塊就是一個包含python代碼的文本文件,擴展名為.py尊惰。我們以一個簡單的打印嵌套列表的函數(shù)為例讲竿,在某個目錄下新建一個.py擴展名的文件(如nestList.py),輸入如下代碼:

#python 3.7
"""
模塊示例
可以打印嵌套列表
"""

# indent表示縮進弄屡,默認0表示無縮進
def print_list(lst, indent = 0):
    for item in lst:
        # 判斷列表lst中的每一項是否是list對象题禀,
        # 如果是則遞歸調用print_list,同時縮進級別加1
        if isinstance(item, list):   
            print_list(item, indent + 1)
        else:
            print("--" * indent, end="")
            print(item)

打開終端琢岩,cd到該.py文件所在的目錄投剥,執(zhí)行python命令進入交互模式,通過import直接導入該模塊測試print_list函數(shù)


交互模式測試導入模塊.png

發(fā)布模塊

上一節(jié)我們已經(jīng)創(chuàng)建并測試了我們的模塊担孔,但是如果我們要共享模塊江锨,還需要一些額外的文件吃警,這些文件集合在一起允許你構建、打包和發(fā)布你自己的模塊

1. 構建前的準備

構建模塊前我們需要創(chuàng)建類似如下的文件目錄結構啄育,example_pkg目錄下創(chuàng)建文件LICENSE,README.md,setup.py三個文件酌心,子目錄example_pkg_zx1下創(chuàng)建__init__.py(注意是兩個下劃線),拷貝上一節(jié)創(chuàng)建的nestList.py到此目錄下挑豌,我們逐個說明下其余各個文件的內容。

構建前文件目錄.png

  • setup.py是setuptools的構建腳本侯勉,它告訴setuptools你的包的相關信息(如包名稱、版本等)
import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example_pkg_zx1",
    version="0.0.1",
    author="Example Author",
    author_email="author@example.com",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/PepperPapa/xinNotes",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
)
  • name址貌,version徘键,author,author_email吹害,description,url根據(jù)名稱的含義參考你的模塊功能進行填寫即可它呀,沒有特別要注意的地方。(注:name參數(shù)在上傳到internet上要求必須是唯一的钟些,不能有重復绊谭,否則無法上傳)
  • long_description為讀取README.md的內容政恍,encoding="utf-8"設置是為了README.md的內容支持中文达传,long_description_content_type執(zhí)定long_description內容格式為markdown。
  • packages通過setuptools.find_packages()函數(shù)會查找目錄example_pkg_zx1下所有需要包含的模塊宪赶,避免手工輸入的麻煩宗弯。
  • classifiers提供一些額外的模塊信息,是一個列表格式搂妻。
  • LICENSE是規(guī)定了你使用哪種協(xié)議發(fā)布自己的模塊蒙保,如下MIT license的內容。如果你只是學習如何發(fā)布欲主,直接copy如下內容即可邓厕,不用特別關注逝嚎。
Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
  • README.md的內容也就是對模塊的詳細說明,示例如下:
# Example Package

nestList.py是一個可以打印縮進列表的示例函數(shù),示例代碼如下:

    from example_pkg_zx1 import nestList
    alist = ["grace", "angle", "roy", 
                ["anna", "jhon", "richard", ["nio", "lily"]], 
                "bluce"]        
    nestList.print_list(alist)
  • __init__.py僅一行代碼详恼,提供模塊名稱信息
name = "example_pkg_zx1"

2. 構建發(fā)布文件

接下來就是要構建發(fā)布文件了补君,會用到setuptools和wheel兩個工具,終端下執(zhí)行如下命令確保已經(jīng)安裝了最新版本

python -m pip install --user --upgrade setuptools wheel

安裝setuptools和wheel.png

接著在setup.pyt文件所在目錄下執(zhí)行如下命令開始構建

python setup.py sdist bdist_wheel

開始構建.png

構建完成后會創(chuàng)建多個文件及目錄昧互,其中dist目錄下會生成.whl和.tar.gz兩個文件


構建后文件目錄.png

上傳模塊到PyPI

最激動人心的莫過是把自己的模塊分享到internet上挽铁,讓全球的程序員都能使用你貢獻的代碼,想想都很激動吧敞掘。因為只是演示如何上傳模塊叽掘,并不是真正有用的模塊,最好是能通過一個測試平臺來給大家來練習玖雁,Test PyPI就是提供這樣的功能够掠,讓你隨意上傳自己的模塊進行測試和實驗,首先你需要在注冊Test PypI頁面上注冊一個賬戶并登陸郵箱驗證茄菊。上傳發(fā)布包需要用到twine這個工具疯潭,首先需要通過下面的命令進行安裝。

python -m pip install --user --upgrade twine

安裝上傳工具twine.png

安裝成功后面殖,在example_pkg目錄下使用下面的命令上傳你的發(fā)布包

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

上傳自己的模塊.png

說明:
1.你的模塊名稱及子目錄名稱(示例為example_pkg_zx1)不能有重復竖哩,否則上傳會失敗,提示HTTPError: 403 Client Error: The user 'xxxx' isn't allowed to upload to project 'example-pkg'錯誤脊僚,遇到這種情況需要修改子目錄example_pkg_zx1及setup.py中的name相叁,然后重新嘗試上傳直到成功。

提示上傳成功后辽幌,登陸Test PypI頁面Your projects下查看應該就能看到你上傳的模塊了增淹。


test_pypi查看上傳的模塊.png

從PyPI安裝自己的模塊

你可以使用pip從Test PyPI上安裝你的模塊來驗證是否能工作,example_pkg_zx1為模塊名稱

python -m pip install --index-url https://test.pypi.org/simple/ example_pkg_zx1

注意上面的命令不要在example_pkg目錄下執(zhí)行乌企,否則會提示模塊已經(jīng)存在而不執(zhí)行安裝虑润,隨意cd到其他的目錄下執(zhí)行


從test_pypi安裝自己的模塊.png

交互模式下測試已安裝的模塊


驗證已安裝模塊.png

最后的提示

如果你已經(jīng)準備好了正式發(fā)布自己的模塊到PyPI(與Test PyPI不同哦),你需要首先在https://pypi.org上注冊正式的賬戶并驗證郵箱拳喻,twine上傳命令直接使用"twine upload dist/*"命令即可冗澈,不用再指定url陋葡;同樣從PyPI安裝模塊直接使用命令"pip install your-package-name"進行安裝,也不用指定url颊亮。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末终惑,一起剝皮案震驚了整個濱河市门扇,隨后出現(xiàn)的幾起案子臼寄,更是在濱河造成了極大的恐慌,老刑警劉巖质帅,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煤惩,死亡現(xiàn)場離奇詭異魄揉,居然都是意外死亡拭宁,警方通過查閱死者的電腦和手機杰标,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門腔剂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驻仅,你說我怎么就攤上這事登渣∈ぜ耄” “怎么了呻顽?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵廊遍,是天一觀的道長。 經(jīng)常有香客問我没酣,道長裕便,這世上最難降的妖魔是什么见咒? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任改览,我火速辦了婚禮,結果婚禮上漏设,老公的妹妹穿的比我還像新娘郑口。我一直安慰自己盾鳞,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著推励,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稿黄。 梳的紋絲不亂的頭發(fā)上杆怕,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音寝杖,去河邊找鬼互纯。 笑死,一個胖子當著我的面吹牛收苏,可吹牛的內容都是我干的鹿霸。 我是一名探鬼主播秆乳,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼屹堰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睦袖?” 一聲冷哼從身側響起荣刑,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤厉亏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后皿淋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恬试,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畦粮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乖阵。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吏祸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情贡翘,我是刑警寧澤砰逻,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布蝠咆,位于F島的核電站,受9級特大地震影響闸翅,放射性物質發(fā)生泄漏菊霜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一记某、第九天 我趴在偏房一處隱蔽的房頂上張望辙纬。 院中可真熱鬧叭喜,春花似錦、人聲如沸譬涡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陨瘩。三九已至,卻和暖如春帚湘,著一層夾襖步出監(jiān)牢的瞬間甚淡,已是汗流浹背贯卦。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贿堰,地道東北人啡彬。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓外遇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诡渴。 傳聞我的和親對象是個殘疾皇子菲语,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容