Python程序包的構(gòu)建和發(fā)布過(guò)程示例詳解
關(guān)于我
編程界的一名小程序猿,目前在一個(gè)創(chuàng)業(yè)團(tuán)隊(duì)任team lead,技術(shù)棧涉及Android、Python、Java和Go,這個(gè)也是我們團(tuán)隊(duì)的主要技術(shù)棧。 聯(lián)系:hylinux1024@gmail.com
當(dāng)我們開(kāi)發(fā)了一個(gè)開(kāi)源項(xiàng)目時(shí),就希望把這個(gè)項(xiàng)目打包然后發(fā)布到 pypi.org 上,別人就可以通過(guò) pip install 的命令進(jìn)行安裝。本文的教程來(lái)自于 Python 官方文檔 , 如有不正確的地方歡迎評(píng)論拍磚。
0x00 創(chuàng)建項(xiàng)目
本文使用到的項(xiàng)目目錄為
➜ packaging-tutorial . └── bestpkg └── __init__.py
接下來(lái)的所有操作都是在 packing_tutorial 這個(gè)目錄下進(jìn)行的。首先把 bestpkg 這個(gè)目錄下的 __init__.py 添加以下內(nèi)容
info='packaging demo'
這個(gè)信息主要用于打包成功后安裝測(cè)試用的。
0x01 項(xiàng)目結(jié)構(gòu)
一個(gè)待發(fā)布的項(xiàng)目還需要有以下這些文件: setup.py 、 LICENSE 和 README.md
➜ packaging-tutorial . ├── LICENSE ├── README.md ├── bestpkg │ └── __init__.py └── setup.py
0x02 setup.py
setup.py 文件是給 setuptools 工具的使用腳本,告訴 setuptools 如何構(gòu)建我們的項(xiàng)目。打開(kāi)編輯器,編輯 setup.py 文件,輸入以下內(nèi)容
import setuptools # 讀取項(xiàng)目的readme介紹 with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="bestpkg",# 項(xiàng)目名稱,保證它的唯一性,不要跟已存在的包名沖突即可 version="0.0.1", author="hylinux1024", # 項(xiàng)目作者 author_email="hylinux1024@gmail.com", description="一個(gè)牛逼的程序", # 項(xiàng)目的一句話描述 long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/hylinux1024/niubiproject",# 項(xiàng)目地址 packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
- name
- 項(xiàng)目名稱,保證它的唯一性,不要跟已存在的包名沖突即可,否則會(huì)發(fā)布失敗
- version
- 版本號(hào)
- author
- 作者
- author_email
- 作者郵箱
- description
- 一句話描述項(xiàng)目
- long_description
- 項(xiàng)目詳細(xì)說(shuō)明,一般直接讀取README.md的內(nèi)容
- url
- 項(xiàng)目的鏈接地址
- packages
- 列出當(dāng)前項(xiàng)目的包,一般直接使用 find_packages() 即可
- classifiers
- 這里指定 Python 的兼容版本是 Python3 ,也指定了項(xiàng)目使用的開(kāi)源協(xié)議。
0x03 README.md
給項(xiàng)目添加詳細(xì)的 README
# Example Package This is a simple example package. You can use [Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/) to write your content.
0x04 LICENSE
要發(fā)布包到 pypi 上,選擇一個(gè)合適的開(kāi)源協(xié)議是非常重要的。如果不知道怎么選可以到choosealicense.com/這里看看。
0x05 項(xiàng)目打包
項(xiàng)目需要打包后才能發(fā)布,要打包項(xiàng)目需先安裝最新版本的 setuptools 和 wheel
➜ python3 -m pip install --user --upgrade setuptools wheel
然后使用以下命令進(jìn)行打包
➜ python3 setup.py sdist bdist_wheel
當(dāng)看到以下信息,說(shuō)明已經(jīng)打包成功
... ... ... adding license file "LICENSE" (matched pattern "LICEN[CS]E*") creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it adding 'bestpkg/__init__.py' adding 'bestpkg-0.0.1.dist-info/LICENSE' adding 'bestpkg-0.0.1.dist-info/METADATA' adding 'bestpkg-0.0.1.dist-info/WHEEL' adding 'bestpkg-0.0.1.dist-info/top_level.txt' adding 'bestpkg-0.0.1.dist-info/RECORD' removing build/bdist.macosx-10.14-x86_64/wheel
在項(xiàng)目目錄下會(huì)生成一個(gè) dist 和 build 文件夾
➜ packaging-tutorial tree . ├── LICENSE ├── README.md ├── bestpkg │ └── __init__.py ├── bestpkg.egg-info │ ├── PKG-INFO │ ├── SOURCES.txt │ ├── dependency_links.txt │ └── top_level.txt ├── build │ ├── bdist.macosx-10.14-x86_64 │ ├── bdist.macosx-10.9-x86_64 │ └── lib │ └── bestpkg │ └── __init__.py ├── dist │ ├── bestpkg-0.0.1-py3-none-any.whl │ └── bestpkg-0.0.1.tar.gz └── setup.py 8 directories, 11 files
在 dist 文件中有兩個(gè)文件
dist ├── bestpkg-0.0.1-py3-none-any.whl └── bestpkg-0.0.1.tar.gz
tar.gz 文件是源碼文件壓縮包,而 .whl 就是打包后的文件。最新的 pip 命令會(huì)安裝這個(gè) .whl 文件。
0x06 上傳
現(xiàn)在就可以上傳到 Python 索引庫(kù)了。我們使用 Test PyPI ,這個(gè)是測(cè)試用的 Pypi ,本例子也是使用 Test Pypi 。
首先要到 test.pypi.org/account/reg… 注冊(cè)賬號(hào)。本例中我注冊(cè)的賬號(hào)為: hylinux1024 。
然后使用 twine 工具來(lái)上傳我們的包。使用以下命令進(jìn)行安裝:
➜ python3 -m pip install --user --upgrade twine
使用以下命令上傳 dist 目錄下的文件
➜ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
這個(gè)命令會(huì)提示輸入剛在 test.pypi.org 上注冊(cè)賬號(hào)密碼,并出現(xiàn)類似以下信息后說(shuō)明已經(jīng)上傳成功。
Enter your username: hylinux1024 Enter your password: Uploading distributions to https://test.pypi.org/legacy/ Uploading bestpkg-0.0.1-py3-none-any.whl 100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s] Uploading bestpkg-0.0.1.tar.gz 100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]
然后打開(kāi) test.pypi.org/project/bes… 這個(gè)地址就可以看到我們發(fā)布的包。
0x07 安裝
發(fā)布成功之后就可以使用 pip 來(lái)安裝來(lái)。我們?cè)谔摂M環(huán)境中安裝,關(guān)于虛擬環(huán)境可以看我前一篇文章。
這里就使用 pipenv ,這里我直接進(jìn)入到我昨天創(chuàng)建的那個(gè)項(xiàng)目中,也為了更好演示安裝結(jié)果。
➜ pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg
在這里我使用 --index-url 參數(shù)是為了指定從 test.pypi.org 中安裝,而不是正式包索引庫(kù)中查找要安裝的包。還有使用了 --no-deps 參數(shù)是因?yàn)楸纠袥](méi)有使用到其它的依賴庫(kù)。
在終端會(huì)看到以下類似信息,說(shuō)明安裝成功
Looking in indexes: https://test.pypi.org/simple/ Collecting bestpkg Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whl Installing collected packages: bestpkg Successfully installed bestpkg-0.0.1
進(jìn)入交互界面
(pipenvdemo) ➜ pipenvdemo python >>> import bestpkg >>> bestpkg.info 'packaging demo'
info 變量就是在 __init__.py 文件中定義的變量。自此我們的包發(fā)布、安裝使用流程就走完了。
要在正式的 Python 索引庫(kù)中發(fā)布,只需要到pypi.org/注冊(cè)賬號(hào),并上傳就可以了。
0x08 總結(jié)一下
通過(guò)一個(gè)簡(jiǎn)單的例子展示 Python 通過(guò) setuptools 工具進(jìn)行打包,然后上傳到 test.pypi.org 的流程。如果要上傳到正式的 pypi.org 上,只需要注冊(cè)一個(gè)正式的賬號(hào)。一旦發(fā)布成功就可以使用 pip install [your-package]
的命令進(jìn)行安裝。
總結(jié)
以上所述是小編給大家介紹的Python程序包的構(gòu)建和發(fā)布過(guò)程示例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
教你使用python做一個(gè)“罰點(diǎn)球”小游戲
這篇文章主要介紹了用python做一個(gè)“罰點(diǎn)球”小游戲,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06Python實(shí)現(xiàn)簡(jiǎn)單的索引排序與搜索功能
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單的索引排序與搜索功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Python數(shù)據(jù)類型學(xué)習(xí)筆記
這篇文章主要針對(duì)Python數(shù)據(jù)類型為大家進(jìn)行了詳細(xì)介紹,整理一篇關(guān)于Python數(shù)據(jù)類型的學(xué)習(xí)筆記,感興趣的小伙伴們可以參考一下2016-01-01利用Python實(shí)現(xiàn)劉謙春晚魔術(shù)
劉謙在2024年春晚上的撕牌魔術(shù)的數(shù)學(xué)原理非常簡(jiǎn)單,可以用Python完美復(fù)現(xiàn),文中通過(guò)代碼示例給大家介紹的非常詳細(xì),感興趣的同學(xué)可以自己動(dòng)手嘗試一下2024-02-02python選取特定列 pandas iloc,loc,icol的使用詳解(列切片及行切片)
今天小編就為大家分享一篇python選取特定列 pandas iloc,loc,icol的使用詳解(列切片及行切片),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Python如何將給定字符串中的大寫(xiě)英文字母按以下對(duì)應(yīng)規(guī)則替換
這篇文章主要介紹了Python如何將給定字符串中的大寫(xiě)英文字母按以下對(duì)應(yīng)規(guī)則替換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10