打開 github.com/new,新建一個公共倉庫。python
源碼地址:github.com/iOSDevLog/s…ios
下載代碼到本地,使用 ssh
協議。git
git clone git@github.com:iOSDevLog/slmethod.git
複製代碼
使用 cz-cli 提交代碼。github
git cz
複製代碼
mkvirtualenv slm
複製代碼
slmethod
├── LICENSE
├── README.md
└── slm
└── __init__.py
複製代碼
編輯 slm/__init__.py
bash
name = "slm"
複製代碼
setup.py
setup.py
是 setuptools 的構建腳本。它告訴 setuptools
你的包(例如名稱和版本)以及要包含的代碼文件。服務器
打開 setup.py
並輸入如下內容,更新軟件包名稱以包含您的用戶名。markdown
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="slm",
version="0.0.1",
author="iOSDevLog",
author_email="iosdevlog@iosdevlog.com",
description="Statistical Learning Method package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/iOSDevLog/slmethod",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"License :: OSI Approved :: MIT License",
"Operating System :: Microsoft :: Windows",
"Operating System :: POSIX",
"Operating System :: Unix",
"Operating System :: MacOS",
],
)
複製代碼
setup()
須要幾個論點。此示例包使用相對最小的集:ssh
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 導入包 的列表。咱們可使用 自動發現全部包和子包,而不是手動列出每一個包。在這種狀況下,包列表將是 slm
由於它是惟一存在的包。find_packages()
classifiers
給出了指數和 pip 你的包一些額外的元數據。在這種狀況下,該軟件包僅與 Python 3 兼容,根據 MIT 許可證進行許可,而且與操做系統無關。您應始終至少包含您的軟件包所使用的 Python 版本,軟件包可用的許可證以及您的軟件包將使用的操做系統。有關分類器的完整列表,請參閱 pypi.org/classifiers…。除了這裏提到的還有不少。有關詳細信息,請參閱 打包和分發項目。ide
下一步是爲 包 生成分發包。這些是上傳到包索引的檔案,能夠經過 pip 安裝。學習
確保您擁有 setuptools
並 wheel
安裝了最新版本:
python3 -m pip install --user --upgrade setuptools wheel # 不在虛擬環境時
python3 -m pip install --upgrade setuptools wheel # 在虛擬環境不須要 --user
複製代碼
小提示
若是您在安裝它們時遇到問題,請參閱 安裝包 教程。
如今從 setup.py
位於的同一目錄運行此命令:
python3 setup.py sdist bdist_wheel
複製代碼
此命令應輸出大量文本,一旦完成,應在 dist
目錄中生成兩個文件:
dist
├── slm-0.0.1-py3-none-any.whl
└── slm-0.0.1.tar.gz
複製代碼
注意
若是您遇到麻煩,請複製輸出並提出有關 包裝問題的問題,咱們會盡力爲您提供幫助!
該 tar.gz
文件是 源存檔, 而該 .whl
文件是 構建的分發。較新的 pip 版本優先安裝構建的發行版,但若是須要,將回退到源代碼存檔。您應該始終上傳源存檔併爲項目兼容的平臺提供構建的存檔。在這種狀況下,咱們的示例包在任何平臺上都與 Python 兼容,所以只須要一個構建的發行版。
最後,是時候將您的包上傳到 Python Package Index 了!
您須要作的第一件事是在 Test PyPI 上註冊一個賬戶。Test PyPI 是用於測試和實驗的包索引的單獨實例。這對於像咱們不必定想要上傳到真實索引的本教程這樣的東西很棒。要註冊賬戶,請訪問 test.pypi.org/account/reg… 並完成該頁面上的步驟。在您上傳任何套餐以前,您還須要驗證您的電子郵件地址。有關 Test PyPI 的更多詳細信息,請參閱 使用 TestPyPI。
如今您已註冊,您可使用 twine 上傳分發包。你須要安裝 Twine:
python3 -m pip install --user --upgrade twine
python3 -m pip install --upgrade twine # 虛擬環境不用 --user
複製代碼
安裝完成後,運行 Twine 以上傳全部存檔 dist
:
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
複製代碼
系統將提示您輸入使用 Test PyPI 註冊的用戶名和密碼。
python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Enter your username: iOSDevLog
Enter your password:
Uploading distributions to https://test.pypi.org/legacy/
Uploading slm-0.0.1-py3-none-any.whl
100%|██████████████████████████████████████████████████████████████████████████████████| 5.95k/5.95k [00:00<00:00, 12.2kB/s]
NOTE: Try --verbose to see response content.
HTTPError: 403 Client Error: Invalid or non-existent authentication information. for url: https://test.pypi.org/legacy/
複製代碼
錯誤的用戶驗證信息,你須要建立一個用戶驗證文件 ~/.pypirc
。
[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username =
password =
複製代碼
使用 twine upload dist/*
上傳。
twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Uploading slm-0.0.1-py3-none-any.whl
100%|███████████████████████████████████████████████████████████████████████████████| 5.95k/5.95k [00:01<00:00, 3.11kB/s]
NOTE: Try --verbose to see response content.
HTTPError: 403 Client Error: The user 'iosdevlog' isn't allowed to upload to project 'slm'. See https://pypi.org/help/#project-name for more information. for url: https://upload.pypi.org/legacy/ 複製代碼
可能有重名了,我改一下。
name="slm"
複製代碼
改成
name="slmethod",
複製代碼
再試一次。
python3 setup.py sdist bdist_wheel
twine upload dist/*
複製代碼
命令完成後,您應該看到與此相似的輸出:
Uploading distributions to https://upload.pypi.org/legacy/
Uploading slmethod-0.0.1-py3-none-any.whl
100%|███████████████████████████████████████████████████████████████████████████████| 6.01k/6.01k [00:00<00:00, 8.88kB/s]
Uploading slmethod-0.0.1.tar.gz
100%|███████████████████████████████████████████████████████████████████████████████| 4.91k/4.91k [00:01<00:00, 4.19kB/s]
複製代碼
上傳後,您的軟件包應該能夠在 TestPyPI 上查看,例如,pypi.org/project/slm…
pip install slmethod
Collecting slmethod
Downloading https://files.pythonhosted.org/packages/14/ab/9cc45b2879bf1e37963c6d36007974b3f9519d6a83169fc4a94252ea9a7c/slmethod-0.0.1-py3-none-any.whl
Installing collected packages: slmethod
Successfully installed slmethod-0.0.1
複製代碼
或者
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps slmethod
複製代碼
Collecting slmethod
Downloading https://test-files.pythonhosted.org/packages/.../slmethod-0.0.1-py3-none-any.whl
Installing collected packages: slmethod
Successfully installed slmethod-0.0.1
複製代碼
確保在包名中指定您的用戶名!
pip 應該從 Test PyPI 安裝包,輸出應該以下所示:
python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps slmethod
複製代碼
注意
此示例使用 --index-url
flag 指定 TestPyPI 而不是實時 PyPI。另外,它指定 --no-deps
。因爲 TestPyPI 與實時 PyPI 沒有相同的包,所以嘗試安裝依賴項可能會失敗或安裝意外的事情。雖然咱們的示例包沒有任何依賴關係,但在使用 TestPyPI 時避免安裝依賴項是一種很好的作法。
您能夠經過導入模塊並引用先前 name
放置的屬性來測試它是否已正確安裝 __init__.py
。
運行 Python 解釋器(確保你仍然在你的 virtualenv 中):
python
複製代碼
而後導入模塊並打印出 name
屬性。這應該是同樣的,無論你的名字你給您的 分發包 中 setup.py
(在這種狀況下,slm
),由於你的導入包 是 slm
。
>>> import slmethod
>>> print(slmethod.name)
slmethod
複製代碼
恭喜,您已經打包並分發了一個 Python 項目! ✨🍰✨
請記住,本教程向您展現瞭如何將程序包上傳到 Test PyPI,它不是永久存儲。測試系統偶爾會刪除軟件包和賬戶。最好使用 Test PyPI 進行測試和實驗,如本教程。
當您準備將真實包上傳到 Python 包索引時,您能夠像在本教程中那樣執行相同操做,但具備如下重要差別:
twine upload dist/*
pip install [your-package]
在這一點上,若是你想閱讀更多關於包裝的 Python 庫,你能夠作如下事情: