背景
最近一直在使用uv做python包管理,用起來很方便。
尤其是在代碼上傳到github的時候,pyproject.toml
會顯示出當前項目依賴的python包。這樣在把代碼下載到本地之后,直接uv sync
就可以很方便地恢復出python環境。
uv 除了有上述優點,直接通過 uv build
就可以把當前代碼給打包成whl文件,上傳到pypi,或者自己本地安裝。
下述用一個例子介紹python打包。
項目詳情
這是 vector_pkag
項目結構。
vector_pkag
├── pyproject.toml
├── README.md
├── src
│ └── vector_pkag
│ ├── init_vector.py
│ ├── sum_vector.py
│ └── vector_base.py
└── tests└── test_vector.py
整個項目完整的代碼,已經上傳到githun: https://github.com/JieShenAI/csdn/tree/main/25/08/vector_pkag
建議把包相關的代碼代碼都放到src目錄下。init_vector
和sum_vector
是兩個工具,里面實現的代碼并不重要,只需要知道 vector_base
調用了這兩個工具就行。
vector_base.py
的具體實現如下:
from dataclasses import dataclassfrom .init_vector import init_vector as init_v
from vector_pkag.sum_vector import sum_vector as sum_v@dataclass
class Vector:x : inty : intdef add(self, other):self.x += other.xself.y += other.ydef __repr__(self):return f"Vector({self.x}, {self.y})"def init_vector(self):return init_v(self)def sum_vector(self)->int:return sum_v(self)
init_vector
和 sum_vector
在同一個目錄下,采用兩種不同的方式進行導包,是為了說明這兩種方式都可以寫。
from .init_vector import init_vector as init_v
from vector_pkag.sum_vector import sum_vector as sum_v
包的測試
我們的包的代碼,都在src目錄下,在這個包還沒有發布的時候,需要對包內的模型寫測試。
我們需要在vscode的 settings.json 文件中,添加上配置信息,實現把每個項目的根目錄和src文件夾都添加到python path路徑中。
這樣就可以保證tests內部的測試代碼與包發布后的代碼保持一致。
test/test_vectory.py
的實現如下:
即使內部的文件夾中,也可以直接導入 vector_pkag。
from vector_pkag.vector_base import Vectorv = Vector(1, 2)print(v.sum_vector())print(v.init_vector())print(v.sum_vector())
vscode 的 settings.json
ctrl+shift+p,然后在搜索框中搜索 settings,就可以搜索到該json文件。
在vscode的settings.json添加下述配置項。
// 用于代碼自動補全的路徑
"python.autoComplete.extraPaths": ["${workspaceFolder}"],
// 用于語言服務分析(語法檢查、跳轉等)的路徑
"python.analysis.extraPaths": ["${workspaceFolder}"],
// 終端中生效的 PYTHONPATH(可選,確保終端運行時也能識別)
"terminal.integrated.env.windows": {"PYTHONPATH": "${workspaceFolder}/src;${workspaceFolder};${env:PYTHONPATH}"
},
"terminal.integrated.env.osx": {"PYTHONPATH": "${workspaceFolder}/src:${workspaceFolder}:${env:PYTHONPATH}"
},
"terminal.integrated.env.linux": {"PYTHONPATH": "${workspaceFolder}/src:${workspaceFolder}:${env:PYTHONPATH}"
},
進行上述設置后,只有在py文件中才有效。在jupyter文件,卻沒有把項目文件夾地址和src地址添加到sys.path中。
.env
PYTHONPATH=${workspaceFolder}/src:${workspaceFolder}:${PYTHONPATH}
在settings.json 添加下述配置,這樣jupyter也可以設置成功:
"python.envFile": "${workspaceFolder}/.env",
"jupyter.envFile": "${workspaceFolder}/.env"
打包
uv 打包很方便,運行下述命令即可。
uv build
會打包成whl文件
dist
├── vector_pkag-0.1.0-py3-none-any.whl
└── vector_pkag-0.1.0.tar.gz
uv 安裝對應的whl文件
把 vector_pkag-0.1.0-py3-none-any.whl 拷貝到另外一個需要裝包的uv項目pkags目錄下。
再運行下述命令進行裝包
uv add pkags/vector_pkag-0.1.0-py3-none-any.whl
需要裝包的uv項目的 pyproject.toml 詳情如下:
[project]
name = "test"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = ["vector-pkag",
][tool.uv.sources]
vector-pkag = { path = "pkags/vector_pkag-0.1.0-py3-none-any.whl" }[[tool.uv.index]]
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true
上面顯示了當前uv項目安裝了 vector-pkag,該包來自 pkags 目錄。