本教程將指導您如何打包一個簡單的Python項目。它將向您展現如何添加必要的文件和結構來建立包,如何構建包以及如何將其上載到Python包索引。html
本教程使用一個名爲的簡單項目example_pkg
。若是您不熟悉Python的模塊和導入包,請花幾分鐘時間閱讀包含文件包和模塊的Python文檔。python
要在本地建立此項目,請建立如下文件結構:git
/example_pkg
/example_pkg
__init__.py
建立此結構後,您將須要在頂級文件夾中運行本教程中的全部命令 - 因此必定要確保。cd example_pkg
github
您還應該編輯example_pkg/__init__.py
並在其中放入如下代碼:bash
name = "example_pkg"
這只是爲了您能夠在本教程後面驗證它是否正確安裝。markdown
如今,您將建立一些文件來打包此項目並準備分發。建立下面列出的新文件 - 您將在如下步驟中向其添加內容。ide
/example_pkg
/example_pkg
__init__.py
setup.py
LICENSE
README.md
setup.py
是setuptools的構建腳本。它告訴setuptools你的包(例如名稱和版本)以及要包含的代碼文件。測試
打開setup.py
並輸入如下內容,您能夠根據須要個性化值:ui
import setuptools with open("README.md", "r") as fh: long_description = fh.read() setuptools.setup( name="example_pkg", 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/pypa/sampleproject", packages=setuptools.find_packages(), classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], )
setup()
有幾個論點。此示例包使用相對最小的集:this
name
是您的包的名稱。只要包含字母,數字_
和,就能夠是任何名稱-
。它也不能在pypi.org上使用。version
是包版本看 PEP 440有關版本的更多詳細信息。author
並author_email
用於識別包的做者。description
是一個簡短的,一句話的包的總結。long_description
是包的詳細說明。這顯示在Python Package Index的包詳細信息包中。在這種狀況下,加載長描述README.md
是一種常見模式。long_description_content_type
告訴索引什麼類型的標記用於長描述。在這種狀況下,它是Markdown。url
是項目主頁的URL。對於許多項目,這只是一個指向GitHub,GitLab,Bitbucket或相似代碼託管服務的連接。packages
是應包含在分發包中的全部Python 導入包的列表。咱們可使用 自動發現全部包和子包,而不是手動列出每一個包。在這種狀況下,包列表將是example_pkg,由於它是惟一存在的包。find_packages()
classifiers
告訴索引並點一些關於你的包的其餘元數據。在這種狀況下,該軟件包僅與Python 3兼容,根據MIT許可證進行許可,而且與操做系統無關。您應始終至少包含您的軟件包所使用的Python版本,軟件包可用的許可證以及您的軟件包將使用的操做系統。有關分類器的完整列表,請參閱https://pypi.org/classifiers/。除了這裏提到的還有不少。有關詳細信息,請參閱 打包和分發項目。
打開README.md
並輸入如下內容。若是您願意,能夠自定義此項。
# 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.
上傳到Python Package Index的每一個包都包含許可證,這一點很重要。這告訴用戶安裝您的軟件包可使用您的軟件包的條款。有關選擇許可證的幫助,請參閱 https://choosealicense.com/。選擇許可證後,打開 LICENSE
並輸入許可證文本。例如,若是您選擇了MIT許可證:
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.
下一步是爲包生成分發包。這些是上傳到包索引的檔案,能夠經過pip安裝。
確保您擁有setuptools
並wheel
安裝了最新版本:
python3 -m pip install --user --upgrade setuptools wheel
小費
若是您在安裝這些軟件時遇到問題,請參閱 安裝軟件包教程
如今從setup.py
位於的同一目錄運行此命令:
python3 setup.py sdist bdist_wheel
此命令應輸出大量文本,一旦完成,應在dist
目錄中生成兩個文件:
dist/
example_pkg-0.0.1-py3-none-any.whl
example_pkg-0.0.1.tar.gz
注意
若是您遇到麻煩,請複製輸出並提出有關包裝問題的問題,咱們會盡力爲您提供幫助!
該tar.gz
文件是源存檔,而該.whl
文件是 構建的分發。較新的pip版本優先安裝構建的發行版,但若是須要,將回退到源代碼存檔。您應該始終上傳源存檔併爲項目兼容的平臺提供構建的存檔。在這種狀況下,咱們的示例包在任何平臺上都與Python兼容,所以只須要一個構建的發行版。
最後,是時候將您的包上傳到Python Package Index了!
您須要作的第一件事是在Test PyPI上註冊一個賬戶。Test PyPI是用於測試和實驗的包索引的單獨實例。這對於像咱們不必定想要上傳到真實索引的本教程那樣很棒。要註冊賬戶,請訪問 https://test.pypi.org/account/register/並完成該頁面上的步驟。在您上傳任何軟件包以前,您還須要驗證您的電子郵件地址。有關Test PyPI的更多詳細信息,請參閱 使用TestPyPI。
如今您已註冊,您可使用twine上傳分發包。你須要安裝Twine:
python3 -m pip install --user --upgrade twine
安裝完成後,運行Twine上傳全部存檔dist
:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
系統將提示您輸入使用Test PyPI註冊的用戶名和密碼。命令完成後,您應該看到與此相似的輸出:
Uploading distributions to https://test.pypi.org/legacy/
Enter your username: [your username] Enter your password: Uploading example_pkg-0.0.1-py3-none-any.whl 100%|█████████████████████| 4.65k/4.65k [00:01<00:00, 2.88kB/s] Uploading example_pkg-0.0.1.tar.gz 100%|█████████████████████| 4.25k/4.25k [00:01<00:00, 3.05kB/s]
注意
若是您收到錯誤消息,則須要爲您的包選擇一個惟一的名稱。一個不錯的選擇 。更新參數 ,刪除文件夾,而後 從新生成存檔。The user '[your username]' isn't allowed to upload to project 'example-pkg'
example_pkg_your_username
name
setup.py
dist
上傳後,您的包應該能夠在TestPyPI上查看,例如,https: //test.pypi.org/project/example-pkg
您可使用pip來安裝包並驗證它是否有效。建立一個新的virtualenv(請參閱安裝包以獲取詳細說明)並從TestPyPI安裝包:
python3 -m pip install --index-url https://test.pypi.org/simple/ example_pkg
注意
若是在預覽步驟中使用了不一樣的包名稱,請example_pkg
在上面的命令中使用您的包名稱替換 。
pip應該從Test PyPI安裝包,輸出應該以下所示:
Collecting example_pkg
Downloading https://test-files.pythonhosted.org/packages/.../example_pkg-0.0.1-py3-none-any.whl
Installing collected packages: example-pkg
Successfully installed example-pkg-0.0.1
您能夠經過導入模塊並引用先前name
放置的屬性來測試它是否已正確安裝__init__.py
。
運行Python解釋器(確保你仍然在你的virtualenv中):
python
而後導入模塊並打印出name
屬性。不管您給出的分發包名稱是什麼,這都應該是相同的 ,setup.py
由於您的導入包是example_pkg
。
>>> import example_pkg >>> example_pkg.name 'example_pkg'
恭喜,您已經打包並分發了一個Python項目! ✨🍰✨
請記住,本教程向您展現瞭如何將軟件包上傳到Test PyPI,而測試PyPI是短暫的。偶爾刪除包和賬戶並不罕見。若是您想將軟件包上傳到真正的Python軟件包索引,能夠經過在https://pypi.org上註冊賬戶並按照相同的說明進行上傳,可是,使用上傳軟件包並輸入您的賬戶憑據在真正的PyPI上註冊。您可使用真正的PyPI安裝包 。twineupload dist/*
pip install your-package