統計學習方法 Python 庫

新建 GitHub 倉庫

打開 github.com/new,新建一個公共倉庫。python

  • 倉庫名爲 slmethod, 統計學習方法(Statistical Learning Method)的簡寫
  • Public 公開倉庫
  • 勾選 Initialize this repository with a README
  • .gitignore 選擇 Python
  • 添加 MIT License

new

源碼地址:github.com/iOSDevLog/s…ios

下載代碼到本地,使用 ssh 協議。git

git clone git@github.com:iOSDevLog/slmethod.git
複製代碼

使用 cz-cli 提交代碼。github

git cz
複製代碼

打包 Python 項目

新建虛擬環境

mkvirtualenv slm
複製代碼

建立如下文件結構:

slmethod
├── LICENSE
├── README.md
└── slm
    └── __init__.py
複製代碼

編輯 slm/__init__.pybash

name = "slm"
複製代碼

建立 setup.py

setup.pysetuptools 的構建腳本。它告訴 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 有關版本的更多詳細信息。
  • authorauthor_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 安裝。學習

確保您擁有 setuptoolswheel 安裝了最新版本:

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…

pypy

安裝新上傳的軟件包

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-urlflag 指定 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 包索引時,您能夠像在本教程中那樣執行相同操做,但具備如下重要差別:

  • 爲您的包裝選擇一個使人難忘的獨特名稱。您沒必要像在教程中那樣附加用戶名。
  • pypi.org 上註冊一個賬戶 - 請注意,這些是兩個獨立的服務器,而且測試服務器的登陸詳細信息不與主服務器共享。
  • 使用上傳你的包,並輸入您的憑據爲你真正的 PyPI 註冊的帳號。twine upload dist/*
  • 使用真正的 PyPI 安裝包。pip install [your-package]

在這一點上,若是你想閱讀更多關於包裝的 Python 庫,你能夠作如下事情:

相關文章
相關標籤/搜索