python如何將自己的包上傳到PyPi並可通過pip安裝的方法步驟

當逐漸在用python開發項目或者日常使用時,一般需要大量使用別人提供的包,這些包能高效的幫助我們快速高效的完成指定任務或者需求,不過有時也會想,自己如果能夠把自己的代碼打包並上傳到PyPi,後續其他人也可以通過pip進行安裝,在為Python做出貢獻的同時,對自己也是一件很cool的事情,本文章便詳細介紹如何將自己的代碼打包並上傳到PyPi。

在這之前,也建議大傢在日常使用python時,也需要有模塊的思維,將最為通用的任務模塊化,然後創建包,後續便可以通過導入這個包,快速進行復用。

寫該篇文章時,作者已向PyPi上傳瞭一個名為  common-pkg-dennis 的包,大傢可以通過  pip install common-pkg-dennis 下載安裝並查看(該包內作者簡單放置瞭之前封裝的關於數據庫操作和m3u8類視頻文件下載的方法,包括加密和未加密情況,均可進行下載)

一、創建包

1.1 包概念簡述

Python語言如其他編程語言,講求代碼最大化復用,函數和類是最初級的復用,模塊(本質是一個py文件)是更高一級的復用,而包(本質是包含py文件且包含一個__init__.py文件的文件夾)則是最高程度的復用,一般情況下,一個包會包含一種完成的解決方案,比如scrapy,其中包含瞭完整的爬蟲解決方案。

此處隻是簡單介紹以上概念,詳細的可以通過學習基礎Python知識獲得。

1.2 創建包結構

通常意義上的包結構如下:

example_package
----example_pkg
    ----__init__.py

其中,example_package和example_pkg均為一個文件夾,而__init__.py則為文件夾example_pkg內的一個py文件,該文件為包的標示,是必須有的,可以為空,至於__init__.py文件的作用,此處不進行介紹

當然包可以有多層結構,比如下面的結構:

example_package
----example_pkg
    ----__init__.py
    ----sec_example_pkg
        ----__init__.py

1.3 本地使用

一般在日常使用python時,可將處理關聯性較高的代碼和模塊,包含到一個包內,比如下面的包,即包含瞭處理媒體相關的模塊

media
----__init__.py
----video
    ----__init__.py
    ----volume.py     #包含處理聲音相關函數等
    ----convert.py    #包含轉碼相關功能
    ----combine.py    #包含視頻合成相關
----audio
    ----__init__.py
    ----convert.py    #包含轉碼相關功能
    ----compile.py    #包含編譯相關功能

然後將以上包移動到python的根site_packages文件夾內,或者指定虛擬環境內的site_packages內,然後就可以直接使用import導入以上包或者指定模塊,python會按照包和模塊搜索路徑完成加載

一般日常中,我們基本達到這個程度,不過,如果自己感覺自己維護的包足夠優秀,或者在解決特定領域問題時,足夠強大且性能優異,可上傳到PyPi並與他人共享,說不定自己的包後面很有可能成為python後續版本內的buildin模塊。

二、上傳前準備

2.1 完善包相關信息

我們接著使用example項目舉例,需要在該文件夾內創建以下文件,以為接下來創建可供分發的文件做準備

example_package
----LICENSE.txt    #版權聲明文件
----README.md      #分發包的詳細介紹文件
----example_pkg
    ----__init__.py
----setup.py       #為打包做準備的設置文件
----tests          #測試文件夾,一般用不到

2.1.2 setup.py簡述

setip.py文件相對比較關鍵,一般在該文件內約定此次分發的包的版本號、名稱、作者、聯系方式、項目地址、python版本要求等信息,其文件內最基本的主信息如下:

import setuptools #導入setuptools打包工具
 
with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()
 
setuptools.setup(
    name="example-pkg-YOUR-USERNAME", # 用自己的名替換其中的YOUR_USERNAME_
    version="0.0.1",    #包版本號,便於維護版本
    author="Example Author",    #作者,可以寫自己的姓名
    author_email="[email protected]",    #作者聯系方式,可寫自己的郵箱地址
    description="A small example package",#包的簡述
    long_description=long_description,    #包的詳細介紹,一般在README.md文件內
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",    #自己項目地址,比如github的項目地址
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',    #對python的最低版本要求
)

2.1.3 README.md文件簡述

README.md文件主要是用來對此次發行的包的詳細說明,包括用法和註意事項等

# Example Package
#在此文件內,可使用markdown撰寫對包的詳細介紹和說明,便於別人熟悉和使用,在此不再贅述
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.

2.1.4 LICENSE文件簡述

版權聲明文件,一般告訴使用者可以在什麼場景下使用,如果想詳細瞭解,可訪問 https://choosealicense.com 進行瞭解,此處不再詳細展開,一般直接將以下文案復制至文件內即可

Copyright (c) 2021 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.

2.2 創建可供分發的包

2.2.1 安裝或更新setuptools 和wheel

一般使用setuptools和wheel工具打包生成可上傳和分發,並可使用pip安裝的包文件

#安裝或更新setuotools和wheel
python3 -m pip install  --upgrade setuptools wheel

2.2.2 打包並生成tar.gz和whl文件

然後,在終端或cmd命令窗,將當前路徑cd到setup.py文件所在文件夾,並正式打包

#以mac為例
cd example_packages/example_pkg
#運行以下命令
python3 setup.py sdist bdist_wheel

運行完畢後,如果順利,則會在與setup.py文件同一層級,產生一個dist文件夾,此時文件夾結構如下:

example_package
----LICENSE.txt    #版權聲明文件
----README.md      #分發包的詳細介紹文件
----example_pkg
    ----__init__.py
----setup.py       #為打包做準備的設置文件
----tests          #測試文件夾,一般用不到
----dist

該文件夾內會包含whl和tar.gz類型文件,此時,其實可以直接將該文件轉發給朋友,朋友保存到本地,就可通過pip進行安裝,不過這樣還沒達到我們的目的。

三、上傳包至PyPi

3.1 使用PyPi測試環境先熟悉上傳步驟

PyPi為瞭便於大傢練習上傳過程,所以還同步提供瞭功能與PyPi完全一樣但相互隔離的測試環境,一般通過twine包將以上打包好的文件上傳至PyPi

在這之前,大傢需要首先註冊一個test環境的PyPi賬號,可通過鏈接 https://test.pypi.org/account/register/ 進行註冊。

然後大傢需要在我的→account setting處設置自己用API上傳時使用的token信息,工作原理類似git hub,快速傳送門 https://test.pypi.org/manage/account/#api-tokens。

好瞭,一切準備就緒

3.1.1 安裝twine

首先使用以下命令安裝或更新twine

python3 -m pip install --user --upgrade twine

3.1.2 使用twine上傳

此處,我們將dist下的分發文件,先上傳到PyPi的測試環境,上傳完畢後,可以在測試環境的PyPi自己的主頁,your projects處查看並管理(包括版本信息等,一般就是setup.py文件內設置的信息)

註意,在終端或cmd窗內運行以下命令時,均需保證當前文件夾路徑與setpy.py一致

python3 -m twine upload --repository testpypi dist/*

當運行以上命令後,一般會出現Enter your username和Enter your password提示,其中username輸入__token__,password輸入token值(使用測試環境的token值),然後按Enter即可

3.2 正式上傳至PyPi

當在測試環境上傳成功後,便可上傳至PyPi的生產環境

python3 -m twine upload dist/*

當運行以上命令後,一般會出現Enter your username和Enter your password提示,其中username輸入__token__,password輸入token值(使用正式環境的token值),然後按Enter即可

到此,大功告成,接下來,便可直接用pip進行安裝瞭

四、使用pip安裝測試

4.1 安裝PyPi測試環境的包

運行以下命令,則會從PyPi測試環境下載並安裝上傳的分發包

python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps example-pkg-YOUR-USERNAME #其中 example-pkg-YOUR-USERNAME 即自己指定的包名

4.2 安裝PyPi正式環境的包

pip install example-pkg-YOUR-USERNAME

五、包版本更新

後續,如果需要對自己的包發佈新版本,照以上步驟完成即可,別忘瞭修改setup.py文件內的版本號信息

到此這篇關於python如何將自己的包上傳到PyPi並可通過pip安裝的方法步驟的文章就介紹到這瞭,更多相關python包上傳到PyPi並通過pip安裝內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: