創建並發布自己的python模塊

2021-12-13 大鑫筆記

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

以下內容在windows10系統下驗證OK,其他系統應該差別不大,linux系統python3版本需要將python命令替換為python3

創建模塊

所謂模塊就是一個包含python代碼的文本文件,擴展名為.py。我們以一個簡單的列印嵌套列表的函數為例,在某個目錄下新建一個.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文件所在的目錄,執行python命令進入交互模式,通過import直接導入該模塊測試print_list函數

發布模塊

上一節我們已經創建並測試了我們的模塊,但是如果我們要共享模塊,還需要一些額外的文件,這些文件集合在一起允許你構建、打包和發布你自己的模塊

1. 構建前的準備

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

構建前文件目錄.png

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根據名稱的含義參考你的模塊功能進行填寫即可,沒有特別要注意的地方。(註:name參數在上傳到internet上要求必須是唯一的,不能有重複,否則無法上傳)long_description為讀取README.md的內容,encoding="utf-8"設置是為了README.md的內容支持中文,
long_description_content_type執定long_description內容格式為markdown。packages通過setuptools.find_packages()函數會查找目錄example_pkg_zx1下所有需要包含的模塊,避免手工輸入的麻煩。classifiers提供一些額外的模塊信息,是一個列表格式。

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.

# Example Package

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

from example_pkg_zx1 import nestList
alist = ["grace", "angle", "roy",
["anna", "jhon", "richard", ["nio", "lily"]],
"bluce"]
nestList.print_list(alist)

name = "example_pkg_zx1"

2. 構建發布文件

接下來就是要構建發布文件了,會用到setuptools和wheel兩個工具,終端下執行如下命令確保已經安裝了最新版本

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

安裝setuptools和wheel.png

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

python setup.py sdist bdist_wheel

開始構建.png

構建完成後會創建多個文件及目錄,其中dist目錄下會生成.whl和.tar.gz兩個文件

構建後文件目錄.png

上傳模塊到PyPI

最激動人心的莫過是把自己的模塊分享到internet上,讓全球的程式設計師都能使用你貢獻的代碼,想想都很激動吧。因為只是演示如何上傳模塊,並不是真正有用的模塊,最好是能通過一個測試平臺來給大家來練習,Test PyPI就是提供這樣的功能,讓你隨意上傳自己的模塊進行測試和實驗,首先你需要在註冊Test PypI頁面上註冊一個帳戶並登陸郵箱驗證。上傳發布包需要用到twine這個工具,首先需要通過下面的命令進行安裝。

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

安裝上傳工具twine.png

安裝成功後,在example_pkg目錄下使用下面的命令上傳你的發布包

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目錄下執行,否則會提示模塊已經存在而不執行安裝,隨意cd到其他的目錄下執行


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

驗證已安裝模塊.png

最後的提示

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

相關焦點

  • [Python]函數模塊
    [Python]函數模塊1. 如何構建函數模塊1. 為module創建一個文件夾2.構建發布文件新生成了兩個文件:dist文件夾和MANIFEST文件E:\Github\python\nester_modules>python setup.py sdist   # 這裡輸入命令running sdistrunning checkwarning: sdist: manifest template
  • Python os 模塊
    問題的答案就是python有os 模塊啊!這個os模塊能夠讓你像在Linux命令行中操作文件一樣,在python中也實現同樣的功能,感覺它就是python天生用來替換BASH的,而且它能夠呈現出一種更簡潔友好的腳本體驗!第一步;載入os模塊要想使用os模塊的功能,第一步該怎麼做呢?
  • Python黑帽編程2.6 模塊
    下面我們保存這段代碼為module_sys.py,從終端使用python來運行,並輸入參數「test argument」,如下圖所示:圖32.6.4  創建模塊創建你自己的模塊是十分簡單的,你一直在這樣做!每個以.py結尾的文件都是一個模塊。下面我們先創建一個myModule.py的文件,內容如下:#!
  • 使用Python創建你自己的diff工具
    為什麼我需要自己的diff工具?
  • Python OS模塊簡介
    Python允許開發人員通過Python中的os模塊使用多個依賴於作業系統的功能。這個包抽象了平臺的功能,並提供了相關python函數來導航、創建、刪除和修改文件和文件夾。在本教程中,你將了解如何導入這個包、它的基本功能以及使用這個庫執行數據合併任務的python示例項目。基本函數我們通過一些實例代碼來學習一下這個模塊。
  • Python內置模塊之OS
    今天分享下python內置模塊中的OS模塊,os模塊是大家經常會使用到的,雖然有path這個模塊替代os, 但是大家可能還是比較熟悉os吧,那麼我自己也總結下os模塊中常用的一些方法和屬性。2.文件和目錄的操作方法和變量用途os.getcwd()獲取當前工作目錄,即當前python腳本工作的目錄路徑os.chdir()改變當前工作目錄os.makedirs(')當前路徑創建一個目錄(可多級目錄創建)os.removedirs
  • Python3_模塊(一)
    為此 Python提供了一個辦法,把這些定義存放在文件中,為一些腳本或者交互式的解釋器實例使用,這個文件被稱為模塊。模塊是一個包含所有你定義的函數和變量的文件,其後綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。這也是使用 python標準庫的方法。簡單的來說,模塊,是用一段代碼實現了某個功能的代碼集合,本質上是一個py文件。
  • Python調用MySQL模塊初試
    當然了,我學習還是蠻浮躁的,總是喜歡循序漸進,深入淺出那種,希望短時間的學習能夠看到成效,比如做出幾個demo,寫出幾個算法之類的。   所以我把書先放下,換了個思路來想,如果我學習一門語言,怎麼樣會和目前的工作結合起來更多呢,bingo,那就調用MySQL吧。
  • python發布代碼教程
    (一)發布代碼首先做好發布前的準備工作。在D:\創建一個文件夾mymodule,其中包含mymodule.py和setup.py(包含發布的元數據)兩個文件。文件內容如下:mymodule.py是一個模塊文件,其內容就是tria函數。
  • 【連載電子書六】Python常用模塊
    在導入模塊的一瞬間. python解釋器會先通過sys.modules來判斷該模塊是否已經導入了該模塊. 如果已經導入了則不再導入. 如果該模塊還未導入過. 則系統會做三件事.1. 為導入的模塊創立新的名稱空間(獨立的內存)2. 在新創建的名稱空間中運行該模塊中的代碼3. 創建模塊的名字. 並使用該名稱作為該模塊在當前模塊中引用的名字.
  • python的模塊module介紹
    python按照列表的先後順序,逐個目錄查找,直到找到模塊定義。知道了這一點,我們就可以根據需要手工改造sys.path的列表,比如把我們自己寫的模塊目錄insert到sys.path的一開頭,比如delete掉某個不需要的目錄,比如調換兩個目錄的順序,等等。
  • Python——logging日誌模塊簡介
    二.logging簡介python內置庫,主要用于格式化控制輸出至文件,郵件,終端等等,該模塊提供了很多功能和靈活性。三.參考文獻:python官方文檔logging模塊:https://docs.python.org/3.8/howto/logging.html#四.日誌級別級別說明DEBUG詳細信息,通常僅在診斷問題時才需要。INFO確認一切正常。WARNING表示發生了意外情況,或者表示在不久的將來出現了某些問題(例如「磁碟空間不足」)。
  • Python 中的 Subprocess 模塊
    翻譯丨寫樂原文丨pythonforbeginners以前我一直用os.system()處理一些系統管理任務
  • 如何 Import 自定義的 Python 模塊?
    模塊一樣,通過import導入呢?背景在實際的工作過程中,經常會用到一個功能,如果每次編寫代碼的時候都進行重新編寫或者打開已經編寫好的函數進行複製粘貼,這樣就顯得很麻煩,有沒有什麼方法可以像導入python模塊的那樣,直接把要用的函數以模塊名+方法的形式調用呢?
  • Python 多進程並行編程實踐 - multiprocessing 模塊
    (點擊上方藍字,快速關注我們)伯樂在線專欄作者 - iPytLab如有好文章投稿,請點擊 → 這裡了解詳情前言並行計算是使用並行計算機來減少單個計算問題所需要的時間,我們可以通過利用程式語言顯式的說明計算中的不同部分如何再不同的處理器上同時執行來設計我們的並行程序,最終達到大幅度提升程序效率的目的。
  • Python系列特別篇-模塊
    我們安裝好Python配置好環境變量後可以執行python命令進入Python解釋器,然後進行編碼。舉個例子,下面創建一個demo.py文件,包含兩個函數def twoSum(nums, target): d = {} for i in range(len(nums)): if nums[i] in d: return [d[nums[i]], i] d[target
  • python自動化辦公系列 | python對陣excel—xlrd模塊
    看了好多代碼,目前為止都是散亂的分享,接下來將整理作為專題,進行系統化的一個分享整理,也是我自己學習的過程。第一個的系統化的分享專題——python辦公自動化。本模板旨在分享和解讀完整代碼,只要你有安裝配置好python環境,在pycharm裡安裝相應的第三方文件庫,黏貼代碼即可運行,我會儘量在代碼後面都進行標註解讀。我們以實用型為目的學習。編程類學習,從模仿中掌握突破。需要python教學視頻和資料的在公眾號菜單欄獲取,有任何問題歡迎公眾號後臺聯繫我或加我微信。
  • 使用 Python 創建你自己的 Shell (上)
    於是為了滿足自己的好奇心,我使用 Python 實現了一個名為 yosh (Your Own Shell)的 Shell。本文章所介紹的概念也可以應用於其他程式語言。(提示:你可以在這裡[1]查找本博文使用的原始碼,代碼以 MIT 許可證發布。
  • Python os模塊 常用的功能介紹
    Python os 模塊提供了非常豐富的方法用來處理文件和目錄。使用者不需要關注什麼作業系統就可以對文件進行操作。
  • python 模塊導入詳解
    python 模塊導入詳解在寫python代碼時經常會導入一些內置模塊、第三方模塊或者自己目錄下寫的模塊