Python構(gòu)建包打包.whl文件及使用.whl文件安裝包指南
下面用一個(gè)完整、可運(yùn)行的示例,從零開始演示:
- 如何自己構(gòu)建一個(gè) Python 包
- 如何打包成
.whl文件 - 如何用
.whl文件安裝這個(gè)包
會(huì)覆蓋到常用的配置文件、目錄結(jié)構(gòu)和具體命令。
一、準(zhǔn)備一個(gè)最簡(jiǎn)單的包示例
假設(shè)我們要發(fā)布一個(gè)叫做 mypackage 的包,里面只有一個(gè)函數(shù):add(a, b),返回兩個(gè)數(shù)的和。
1. 創(chuàng)建項(xiàng)目目錄
在任意目錄下創(chuàng)建項(xiàng)目根目錄,例如:
mkdir mypackage-project cd mypackage-project
項(xiàng)目最終結(jié)構(gòu)大致如下(先給一個(gè)概覽,后面逐個(gè)創(chuàng)建):
mypackage-project/ ├─ src/ │ └─ mypackage/ │ ├─ __init__.py │ └─ core.py ├─ tests/ │ └─ test_core.py # 可選 ├─ pyproject.toml ├─ README.md └─ LICENSE # 可選
說(shuō)明:
- 使用
src/目錄結(jié)構(gòu)是目前官方推薦的做法,能避免一些導(dǎo)入問(wèn)題。mypackage是發(fā)布后用戶import時(shí)用到的包名。
二、編寫包的源碼
1. 創(chuàng)建src/mypackage目錄
mkdir -p src/mypackage
2. 創(chuàng)建__init__.py
__init__.py 表示這是一個(gè)包,并且可以在這里定義對(duì)外暴露的接口。
src/mypackage/__init__.py:
""" mypackage 一個(gè)示例 Python 包,用于演示如何打包并生成 whl 文件。 """ from .core import add __all__ = ["add"] __version__ = "0.1.0"
3. 創(chuàng)建核心模塊core.py
src/mypackage/core.py:
def add(a: float, b: float) -> float:
"""返回兩個(gè)數(shù)字的和"""
return a + b
三、配置打包:pyproject.toml
從 Python 3.8+ 開始,推薦使用 PEP 517/518 的 pyproject.toml 來(lái)管理構(gòu)建配置,這也是目前最主流、官方推薦的方式,比老的 setup.py 更簡(jiǎn)單清晰。
在項(xiàng)目根目錄創(chuàng)建 pyproject.toml:
[build-system]
# 指定構(gòu)建后端,常用的有 setuptools、hatchling、poetry 等
# 這里使用 setuptools 作為示例
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage" # 包名(發(fā)布到 PyPI 時(shí)的名字)
version = "0.1.0" # 版本號(hào)
description = "A simple demo package for building wheel files."
readme = "README.md" # 項(xiàng)目說(shuō)明文件
requires-python = ">=3.8"
license = {text = "MIT"} # 簡(jiǎn)單寫法,也可以引用 LICENSE 文件
authors = [
{ name="Your Name", email="you@example.com" }
]
# 安裝此包時(shí)所需的依賴
dependencies = [
# "requests>=2.0.0", # 示例:如果你的包依賴 requests
]
# 給工具和用戶看的分類信息,可選
classifiers = [
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
# 可選:項(xiàng)目主頁(yè)、代碼倉(cāng)庫(kù)等
[project.urls]
"Homepage" = "https://example.com/mypackage"
"Source" = "https://github.com/yourname/mypackage"
核心點(diǎn):
[build-system]告訴pip等工具如何構(gòu)建你的包。[project]描述這個(gè)包的元數(shù)據(jù)(名字、版本號(hào)、依賴等)。
四、可選:README.md和LICENSE
在項(xiàng)目根目錄下創(chuàng)建一個(gè)簡(jiǎn)單的 README.md(安裝后在 PyPI 上會(huì)展示):
README.md:
# mypackage 一個(gè)示例 Python 包,用于演示如何從零構(gòu)建并生成 `.whl` 文件。 ## 安裝 ```bash pip install mypackage
五、使用
from mypackage import add print(add(1, 2)) # 輸出: 3
許可證 `LICENSE` 可以寫常見的 MIT、Apache-2.0 等,這里略過(guò)內(nèi)容。 --- ## 五、可選:添加簡(jiǎn)單測(cè)試 雖然不是構(gòu)建 whl 必需的,但建議有基本測(cè)試。 ```bash mkdir tests
tests/test_core.py:
from mypackage import add
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
可以用 pytest 來(lái)跑測(cè)試:
pip install pytest pytest
六、構(gòu)建.whl文件
1. 安裝構(gòu)建工具
推薦使用 build(官方推薦構(gòu)建前端):
pip install build
2. 在項(xiàng)目根目錄執(zhí)行構(gòu)建命令
確保當(dāng)前路徑是 mypackage-project 的根目錄(和 pyproject.toml 同級(jí)):
python -m build
執(zhí)行成功后,你會(huì)看到類似輸出,并在項(xiàng)目目錄下生成兩個(gè)目錄:
dist/
mypackage-0.1.0-py3-none-any.whl
mypackage-0.1.0.tar.gz
其中:
.whl是你想要的 “輪子” 文件(wheel).tar.gz是源碼包(source distribution)
如果只想生成 wheel,可以:
python -m build --wheel
七、使用.whl文件安裝包
1. 在本機(jī)安裝
假設(shè)當(dāng)前仍在 mypackage-project 目錄下:
pip install dist/mypackage-0.1.0-py3-none-any.whl
安裝后可以在任意地方使用:
>>> from mypackage import add >>> add(2, 5) 7
2. 在另一臺(tái)機(jī)器或離線環(huán)境安裝
只需要把 dist/mypackage-0.1.0-py3-none-any.whl 拷貝到目標(biāo)機(jī)器上,然后執(zhí)行:
pip install mypackage-0.1.0-py3-none-any.whl
不需要源代碼,也不需要聯(lián)網(wǎng)(前提是你的包沒(méi)有需要在線安裝的新依賴,或者依賴也通過(guò) whl 提前準(zhǔn)備好)。
八、常見配置文件和寫法匯總
1. 必需文件(最簡(jiǎn))
pyproject.tomlsrc/mypackage/__init__.py- 你的實(shí)際代碼文件(如
src/mypackage/core.py)
2. 推薦增加的文件
README.mdLICENSEtests/目錄(配合 pytest)
3.pyproject.toml常見字段說(shuō)明(Setuptools 方式)
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "mypackage"
version = "0.1.0"
description = "..."
readme = "README.md"
requires-python = ">=3.8"
license = {text = "MIT"}
authors = [
{ name="Your Name", email="you@example.com" }
]
dependencies = [
"requests>=2.0.0",
"numpy>=1.24",
]
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
]
[project.urls]
"Homepage" = "..."
"Source" = "..."
"Bug Tracker" = "..."
九、補(bǔ)充:使用傳統(tǒng)setup.py的方式(可選了解)
雖然現(xiàn)在更推薦 pyproject.toml,但很多老項(xiàng)目仍在用 setup.py。
如果你想了解一下傳統(tǒng)方式,可以這樣:
1. 創(chuàng)建setup.py
在項(xiàng)目根目錄創(chuàng)建 setup.py:
from setuptools import setup, find_packages
setup(
name="mypackage",
version="0.1.0",
description="A simple demo package for building wheel files.",
author="Your Name",
author_email="you@example.com",
packages=find_packages(where="src"),
package_dir={"": "src"},
python_requires=">=3.8",
install_requires=[
# "requests>=2.0.0",
],
)
2. 構(gòu)建 whl
pip install wheel setuptools python setup.py bdist_wheel
會(huì)在 dist/ 下生成 .whl 文件,同樣可以用 pip install 安裝。
注意:
新項(xiàng)目?jī)?yōu)先用pyproject.toml,setup.py更適合作為兼容舊項(xiàng)目的方式。
十、完整示例小結(jié)
- 創(chuàng)建目錄結(jié)構(gòu):
mypackage-project/ ├─ src/ │ └─ mypackage/ │ ├─ __init__.py │ └─ core.py ├─ pyproject.toml ├─ README.md └─ tests/...
pyproject.toml用 setuptools 作為構(gòu)建后端- 寫好代碼和
__init__.py - 安裝構(gòu)建工具:
pip install build - 在項(xiàng)目根執(zhí)行:
python -m build --wheel - 在
dist/中得到.whl文件 - 使用
pip install dist/xxx.whl安裝使用
總結(jié)
到此這篇關(guān)于Python構(gòu)建包打包.whl文件及使用.whl文件安裝包的文章就介紹到這了,更多相關(guān)Python打包.whl文件及使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python連接數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢的操作代碼
這篇文章主要介紹了Python連接數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)查詢的操作代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
Python機(jī)器學(xué)習(xí)入門(二)之Python數(shù)據(jù)理解
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)入門知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
python將圖片透明背景轉(zhuǎn)為白色背景的兩種方法
這篇文章主要為大家詳細(xì)介紹了python如何使用opencv2和PIL實(shí)現(xiàn)將圖片透明背景轉(zhuǎn)換成白色背景功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-05-05
詳解Python調(diào)用華為API實(shí)現(xiàn)圖像標(biāo)簽
華為云圖像標(biāo)簽可識(shí)別上千種通用物體以及數(shù)百種場(chǎng)景標(biāo)簽,一個(gè)圖像可包含多個(gè)標(biāo)簽內(nèi)容,語(yǔ)義內(nèi)容非常豐富。本文將通過(guò)Python調(diào)用華為API實(shí)現(xiàn)圖像標(biāo)簽,需要的可以參考一下2022-04-04
Python利用Flask-Mail實(shí)現(xiàn)發(fā)送郵件詳解
Flask?的擴(kuò)展包?Flask?-?Mail?通過(guò)包裝了?Python?內(nèi)置的smtplib包,可以用在?Flask?程序中發(fā)送郵件。本文將利用這特性實(shí)現(xiàn)郵件發(fā)送功能,感興趣的可以了解一下2022-08-08
selenium自動(dòng)化測(cè)試簡(jiǎn)單準(zhǔn)備
本文主要介紹了selenium自動(dòng)化測(cè)試簡(jiǎn)單準(zhǔn)備,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Python爬蟲爬取愛奇藝電影片庫(kù)首頁(yè)的實(shí)例代碼
這篇文章主要介紹了Python爬蟲爬取愛奇藝電影片庫(kù)首頁(yè)的實(shí)例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05

