一.簡單介紹
python中我們經常會用到第三方的包作為工具,比如爬蟲解析工具,網絡請求工具等。之所以要把它封裝成包,意識為了技術與業務分離,二是為了能多
項目多平台共用。python里面用到的第三方工具包基本都是從Pypi.org
里面下載的。下面具體介紹如何打一個自己的包上傳到Pypi中作為工具使用。
二.Pypi打包whl文件
首先,我們需要確認我們需要打包的package中已經包含了README.md
、LICENSE[非必須]
和setup/py
文件。三者分別是說明文檔,許可證以及
python setuptools所用來安裝該package的構建腳本。
2.1 setup.py
setup.py中包含了package對應的信息(例如該package的名稱、版本、作者)以及該package應當包含的程序文件和數據。
下面是一個setup.py的示例文件:
import os
from setuptools import setup, find_packages
path = os.path.abspath(os.path.dirname(__file__))
try:
with open(os.path.join(path, 'README.md')) as f:
long_description = f.read()
except Exception as e:
long_description = "customize okta cli"
setup(
name = "okta-cmd",
version = "0.1.0",
keywords = ("pip", "okta", "cli", "cmd", "steven"),
description = "okta cli",
long_description = long_description,
long_description_content_type='text/markdown',
python_requires=">=3.5.0",
license = "MIT Licence",
url = "https://github.com/stevenQiang/okta-cmd",
author = "steven",
author_email = "qianggao7@gmail.com",
packages = find_packages(),
include_package_data = True,
install_requires = ["requests", "click"],
platforms = "any",
scripts = [],
entry_points = {
'console_scripts': [
'okta-cmd=oktacmd:main_cli'
]
}
)
- name: 該package的名字,該名字可以由字母、數字、-組成,注意這個名字不能與其它已經上傳到pypi.org的項目相同
- version: 這個就是包的發布版本,可以直接寫在這,也可以從其它地方引用
- author: author可以用來指定該package的作者信息
- author_email: 這個也是指定該package的作者信息
- description: 對當前package的較短的總結
- long_description: 是對當前package的詳細說明。這一詳細說明將被展示在Python Package Index上當前項目的主頁
- long_description_content_type: 指定了long_description內容的格式。在當前情況下為markdown
- url: 是當前package的主頁鏈接。大多數情況下這是一個GitHub, GitLab, Bitbucket或者其他代碼存儲服務的鏈接
- packages: 是一系列應當包含在發布軟件包文件(distribution package)中的可被import的python包文件。我們可以手動在此處羅列所有文件。
或者如本例中一樣使用find_packages()函數自動包含所有的python包文件以及子包文件。 - python_requires: python依懶版本
- classifiers: 指定了當前package的其他元信息(metadata)。例如當前package兼容的python版本和操作系統,當前package提供的功能的類型,
當前package的許可證等等。我們應當總是至少包括當前package所支持的python版本,操作系統和許可證。注意此處定義的classifiers關鍵字
所包含的信息應當符合PyPI的規定。 - install_requires: 指定了當前package所依賴的其他python類庫。這些指定的python類庫將會在本package被安裝的時候一並被安裝。
- platforms: 程序適用的軟件平台列表
- keywords: 程序的關鍵字列表
- include_package_data: 是否自動包含包內所有受版本控制(cvs/svn/git)的數據文件,默認True
- entry_points: 用來支持自動生成cli命令
使用上面的配置信息之后,會生成一個okta-cmd的命令,可以直接使用,就是在entry_points里面配置的。
目錄結構:
├── LICENSE
├── README.md
├── oktacmd
│ ├── __init__.py
│ ├── cli.py
│ ├── common.py
│ ├── main.py
│ └── okta.py
├── setup.py
└── setup.sh
生成包:
1.安裝最新版的setuptools和wheel
python3 -m pip install --user --upgrade setuptools wheel
2.使用sdist構建源碼分發包
python setup.py sdist bdist_wheel
注意: 這里是固定的命令(確保setup.py存在於當前路徑下)
當這個命令運行結束后,確保在生成的dist/文件夾下存在相應的.whl文件和.tar.gz文件。其中.tar.gz文件是我們的python package的源文件文檔,
而.whl是一個軟件分發包(build distribution)。新版本的pip將會首先嘗試安裝軟件分發包,但在失敗情況下會接着嘗試采用源文件包安裝。
三.上傳項目至PyPI
- 首先注冊一個PyPI的賬號,鏈接
https://pypi.org/
- 安裝最新版本twine
python3 -m pip install --user --upgrade twine
3.上傳項目
使用twine上傳項目的時候需要輸入相應的PyPI的賬號和密碼。
python3 -m twine upload dist/*