您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么封裝Python代碼包”,在日常操作中,相信很多人在怎么封裝Python代碼包問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么封裝Python代碼包”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
步驟一:命名
首先是命名。好的名字通常比較簡短,便于在pip install 或 import 完成之后輸入(盡管現在已經出現了“自動輸入”);還要包含足夠的信息便于理解,或者在安裝完成后之后提示其中的內容。
requests負責處理HTTP請求、delorean負責日期和時間,sklearn負責提供機器學習框架,這些都是很好的例子。
不過老實說,這些并不是固守的規則。流行的Python包都有pandas、 keras、 django、 boto、 jinja、 flask 和 pytorch等名稱,大家能記住這些名字,所以讀者也可以使用任何簡短且可讀的名稱(例如,由于可讀性問題,筆者將“Scikit-Learn Wrappers for FastText”縮寫成了skift)。本文以chocobo為例。
步驟二:確定代碼包的基本結構
接下來,通過幾個簡短的步驟,制作一種通用的結構:
1.用代碼包的準確名稱創建一個Github存儲庫,不要使用駝峰式或過多的個人發揮。然后在本地進行復制。
2.在該存儲庫中新建一個文件夾,用代碼包的準確名稱命名;這就是保存代碼包的文件夾。這是一種規范,只需記住外部的chocobo 文件夾(在本例中)就是存儲庫的文件夾,而內部的chocobo 文件夾是包的文件夾。
3.將自己的模塊和涉及到的任何其他模塊放在內部的chocobo文件夾中。如果存在缺失的部分,請添加__init__.py 文件。
4.將用戶直接調用的重要對象(通常是函數)從各自的模塊中導入至__init__.py文件。有了代碼包的命名空間,就可以使用這些函數、分類和變量了。如果愿意,也可以使用代碼包的API。
5.雖然不是強制規定,筆者強烈建議在代碼包或在存儲庫的根目錄中都應包含一個 .gitignore 文件。
現在有了一個結構,可以添加不同類型的文件組成代碼包;內部文件夾保存的是包的代碼,外部文件夾保存的是輔助包文件和其他與存儲庫相關的文件。
因此,初始模塊chocobo.py如下所示:
"""My chocobo cooking script.""" import os def chocobo_roast(num_guests, hotness_level): # amazing python code here
新建存儲庫文件夾如下所示:
chocobo/ chocobo/ __init__.py chocobo.py .gitignore
__init__.py 文件應如下所示:
"""chocobo is a python package for delicious Chocobo recipes.""" from .chocobo import ( chocobo_roast, )
那么在完成封裝之后,chocobo包可以有這樣的使用方法:
"""I'm a script or a different package using chocobo.""" import chococbo def my_feast(num_guests): snacks = bobbish() main_course = chocobo.chocobo_roast(num_guests, 0) dressing = szechuan_chicken_mcnugget_sauce()
以上就是一些要點。
步驟三:許可問題
使用共享許可發布代碼是較為可取的;如果要將自己的代碼公開分享,程序員會想要在保留版權的前提下得到重用代碼的許可,或者讓那些擴展自己代碼的人保證衍生代碼可以自由使用。獲得許可能輕松解決這些問題。
choosealicense.com(https://choosealicense.com/)提供了很多GitHub和開源社區中的實用建議。
無論選擇哪種許可,都比根本不用要好。很多時候,在沒有許可的情況下公開代碼還不如不公開;如果程序員不明確自己對代碼的所有權,大多數公司會因為可能造成的法律糾紛而放棄,從而失去許多潛在用戶。
選擇許可后,在存儲庫中創建LICENSE許可文件(不需要文件擴展名),并導入所選許可的確切文本。
步驟四:安裝文件
現在創建Python封裝工具所需的基本文件(以setuptools為例);setup.py.setup.py 包含了構建和發行時使用的實際指令。
下面是一個初始模板(別擔心,稍后會進行詳細檢查)
"""Setup for the chocobo package.""" import setuptools with open('README.md') as f: README = f.read() setuptools.setup( author="Shay Palachy", author_email="shay.palachy@gmail.com", name='chocobo', license="MIT", description='chocobo is a python package for delicious chocobo recipes.', version='v0.0.3', long_description=README, url='https://github.com/shaypal5/chocobo', packages=setuptools.find_packages(), python_requires=">=3.5", install_requires=['requests'], classifiers=[ # Trove classifiers # (https://pypi.python.org/pypi?%3Aaction=list_classifiers) 'Development Status :: 4 - Beta', 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Topic :: Software Development :: Libraries', 'Topic :: Software Development :: Libraries :: Python Modules', 'Intended Audience :: Developers', ], )
首先,導入setuptools。這是一個非常有用代碼包,可輕松對Python包進行發行,即使它不包括在標準庫中(類似的distutils是比不了的),它仍然是當今Python包發行的標準,應該牢記于心。本文只使用了setuptools包中的兩個函數:setup和find_packagges。
在導入setuptools之后,調用setup()函數之前,只需將README.md 文件的內容讀入到全局變量 README中即可。
然后只需通過以下變量調用setuptools.setup() 函數即可:
author:輸入姓名。
author_email:輸入郵箱。
name:代碼包的名稱,在本例中為“chocobo”。
license:在本例中為字符串“MIT”,或選擇其他許可證。
description:代碼包的簡短介紹,控制在一行以內。例如:“chocobo代碼包是制作美味chocobo的食譜”
version:表示封裝的當前版本的字符串。筆者在之后的文章中會介紹更簡潔的處理方法,但是目前,只需要在想要發布新版本時手動增加一個數字就可以了。通常的做法是將版本號前加入字母V,因此v1是第一個版本的版本字符串,但筆者建議將v0.0.1 視為等效版本字符串并使用此格式。后文將詳細介紹這種做法的意義。
long_description:表示README的內容。該部分是代碼包的詳細描述。也就是該頁面PyPI的內容(示例:https://pypi.org/project/pdpipe/)。
url:可鏈接到代碼包的主頁。如果讀者沒有專用的站點,那么存儲庫的URL是一個不錯的選擇。
packages: 又一次提到了setuptools!根據命令,這個參數獲取要生成和發行/安裝的所有代碼包的名稱數組。從技術上講,可以直接使用[“chocobo”]這個名字,但是最好是將其通用化,并使用setuptools 函數,它能處理更復雜的包和存儲庫結構。有兩個可選參數可以作為輸入數據,where 和exclude,但在這里忽略不計。作為結果,where可鏈接至安裝文件所在的目錄,包括所有子目錄,一般來說這樣已經足夠了。
python_requires: 如果你的電腦支持Python的所有版本,就不必顧及此參數。如果不能,應該選擇一個適當的值。從技術上講,筆者不贊成使用未經測試的版本,但保險期間目前我們可以進行適當的假設:
(1) 如果讀者正在使用Python2,特別是Python2.7版本,可以得出以下兩點結論:(a)你獨樹一幟,十分優秀(b)你的電腦配置只需支持Python2.7即可,所以可以使用“>=2.7”這個字符來編輯這個參數。另外,時代在進步,試試Python3吧。
(2) 如果讀者使用的是Python3,那么任何Python版本都大于或等于用來開發代碼包的版本。以此類推,如果使用的是Python3.5,那么應該設置成“>=3.5”。
install_requires: 此處列出的是所有非標準庫代碼包的使用前提。例如,如果chocobo 需要requests和 pytz 才能運行的話,那么該參數應設置為:[“ requests”,“pytz”]。
classifiers: 連同其他成千上萬個代碼包一起,你的代碼包也會很快PyPI上線。為了進行區分,作者可以向PyPI提供一個列表,列出trove分類器來對每個版本進行分類,描述其用途、支持的系統和開發進度。然后,社區成員可以使用這些標準化的分類器,根據自己的需求來查找項目(盡管不確定誰會進行這項操作)。
建議從以下幾個開始:
“Development Status :: 3 — Alpha”
“License :: OSI Approved :: MIT License”
“ Programming Language :: Python”
“ Programming Language :: Python :: 3.5”
“ Programming Language :: Python :: 3.6”
“ Programming Language :: Python :: 3.7”
“Topic :: Software Development :: Libraries”
“Topic :: Software Development :: Libraries :: Python Modules”
“Intended Audience :: Developers”
步驟五:建立發行文件
Python包位于發行文件中,這些文件會統一被上傳到一個服務器中(通常是PyPI全局服務器),供公眾下載。
首先,確保安裝了最新版本的setuptools 以及 wheel:
python3 -m pip install --user --upgrade setuptools wheel
要構建發行文件,只需在setup.py所在的存儲庫的根目錄中運行以下命令:
python setup.py sdist bdist_wheel
在這一步,需要Python運行setup.py這個腳本,并向它發送兩個參數,生成源文件(參數sdist),以及wheel工具來構建發行文件(參數bdist_wheel)。
運行此命令時,將在調用目錄中創建三個文件夾: build, dist 和 chocobo.egg-info。對于.gitignore 文件來說,這三個可以忽略不計。如果這些目錄已經存在(例如,該命令之前已經運行過了,最好用rm -rf build dist將這些目錄刪除掉,因為dist 下的任何有效代碼包文件都將被上傳。
要上傳的兩個文件位于dist 文件夾中:分別為chocobo-0.0.3-py-none.any.whl (構建發行;是一個wheel 文件)和chocobo-0.0.3.tar.gz (源發行;是一個壓縮的tar 文件)。創建成功后,我們繼續上傳的步驟!
步驟六:上傳
剩下的步驟就是將代碼包上傳到PyPI全局服務器!然而,用戶必須先在PyPI網站上注冊。按照注冊的步驟填寫用戶名和密碼。
如果想在上傳到PyPI全局服務器之前測試包,程序員也可以在測試PyPI網站上注冊一個用戶。
現在,用于上傳的Python包將在.pypirc文本文件中查找PyPI用戶名和密碼(通過PyPI服務器進行驗證),該文件通常位于主文件夾中。創建后按如下所示進行填寫(testpypi 部分視具體情況而定):
[distutils] index-servers = pypi testpypi [pypi] username: teapot48 password: myPYPIpassword [testpypi] repository: https://test.pypi.org/legacy/ username: teapot48 password: MYtestPYPIpassword
本文依照最新的方法將文件上傳到PyPI服務器中,并使用twine(上傳Python包的實用工具),而不是使用過時的python setup.py upload 。只需運行:
twine upload dist/*
如果想在PyPI服務器上進行測試,只需運行 twine upload — repository testpypi dist/*
不論如何,上傳.whl 文件時都應該能看到一個進度條,上傳.tar.gz 文檔時應該也能看到一個進度條,然后上傳就完成了。
現在可以在PyPI官方網站上看到自己的Python包頁面了,大家也都能看到!
=
到此,關于“怎么封裝Python代碼包”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。