網站首頁 編程語言 正文
當逐漸在用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="author@example.com", #作者聯系方式,可寫自己的郵箱地址
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文件內的版本號信息
原文鏈接:https://blog.csdn.net/yifengchaoran/article/details/113447773
相關推薦
- 2022-04-17 <el-dropdown>按鈕點擊出來下拉菜單,點擊下拉菜單觸發事件
- 2023-07-24 可拖拽表格保存拖拽順序,按照拖拽順序進行下載
- 2022-08-25 C++示例講解vector容器_C 語言
- 2022-09-23 Windows?10搭建FTP服務器圖文教程_FTP服務器
- 2022-12-11 Django?auth?應用模塊詳解_python
- 2022-06-29 Oracle中case?when函數的用法_oracle
- 2022-06-16 Python數據結構之遞歸可視化詳解_python
- 2022-09-21 Redis實現多級緩存_Redis
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支