一、遇到的問題
自己在做AI開發的時候,先用的conda來管理虛擬環境,然后使用pip freeze > reqiurments來打包相關依賴。
優點,conda環境可以讓不同的項目有單獨的虛擬環境,不會干擾每個項目,還可以多個項目共享一個conda環境。
缺點:
1.項目一旦大的話,python最麻煩的就是環境依賴,本來自己安裝的核心依賴就30個,但是每個庫又依賴別的子庫,這樣下來就有幾百上千個依賴,非常麻煩。
2.如果只刪除主依賴,比如fastapi。但是它的其他子依賴不會被刪除。
3. 別人使用你的項目,不知道你的python版本號,你自己也可能會忘記,需要寫在README.MD中記錄。
二、UV和pyproject.toml介紹
?UV? 是由 Astral 團隊(Ruff 工具開發者)用 Rust 編寫的新一代 Python 包管理器,旨在替代傳統工具鏈(如 pip、virtualenv、poetry 等),提供以下核心優勢:
?極速性能?:依賴解析與安裝速度比 pip 快 10-100 倍,尤其在大型項目中優勢顯著。
?一體化功能?:集成虛擬環境管理、依賴鎖定、Python 版本控制、腳本執行等。
?兼容性?:支持 pyproject.toml 和 requirements.txt,無縫遷移現有項目。
?跨平臺?:支持 Windows、macOS 和 Linux。
??維度?? | ??UV +? | ??Conda?? | ??pip freeze?? |
---|---|---|---|
??性能?? | ? 極快(Rust 并行處理) | ?? 較慢 | ?? 慢(依賴解析無優化) |
??依賴管理?? | ? 結構化分組 + 語義化版本 | ?? 混合來源易沖突 | ? 扁平化、無分組 |
??環境隔離?? | ? 輕量( | ? 強隔離但體積大 | ? 需配合? |
??適用場景?? | Web 服務、微服務、CI/CD | 數據科學、AI(非 Python 依賴) | 舊項目維護 |
??標準化?? | ? PEP 621 官方標準 | ? 私有標準 | ? 非結構化文件 |
?
三、安裝UV和配置環境路徑
?3.1 安裝uv
按?Win + X
→ 選擇 ??“Windows PowerShell(管理員)
# Windows (PowerShell)
irm https://astral.sh/uv/install.ps1 | iex# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
如果你安裝的時候像我一樣,輸入?irm https://astral.sh/uv/install.ps1 | iex 命令后,窗口就自動關閉了。
可以試試
方法 1:臨時修改執行策略(推薦)??
在 ??當前 PowerShell 會話?? 中運行以下命令,允許運行本地腳本(關閉窗口后失效):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
??執行后重試安裝命令??:
irm https://astral.sh/uv/install.ps1 | iex
3.2 設置環境變量
-
??打開環境變量設置??
-
Win + R 輸入?
sysdm.cpl
→ 高級 → 環境變量
-
-
??修改用戶變量??
-
在"用戶變量"區域選擇
Path
→ 編輯 → 新建 -
添加路徑:
C:\Users\GDZD-BG-202115\.local\bin (根據自己的路徑)
-
重啟powershell就可以了驗證是否安裝成功了
uv --version
?
四、?使用UV管理Python項目?
常用命令速查表
??功能?? | ??命令?? |
---|---|
創建虛擬環境 |
|
添加依賴 |
|
同步依賴 |
|
依賴樹查看 |
|
運行腳本 |
|
更新所有依賴 |
|
導出依賴列表 |
|
注意:使用的IDE一定要全部關閉,重啟一下VSCODE,這樣才可以加載到你的全局環境變量。如果你開了多個VSCODE,只是關閉一個其中一個VSCODE,就一直加載不到設置好的全局變量。
而且VSCODE中需要設置默認終端是POWERSHELL
4.1 安裝python版本
打印python支持的所有版本
uv python list
?安裝特定的支持的python版本比如(3.10)
uv python install?cpython-3.10.18-windows-x86_64-none
?
使用 已經下載的python版本運行一個py文件
uv run -p 3.10 hello.py
uv run -p cpython-3.10.0b3 hello.py # 寫全也可以
?
使用python交互界面
uv run -p?cpython-3.10.0b3 python
?
4.2?進入項目初始化項目?
在 VS Code 中新建項目目錄,通過終端執行
uv init -p 3.10
-
??生成文件??:
-
pyproject.toml
:記錄項目元數據(名稱、Python 版本、依賴) -
.python-version
:指定項目默認 Python 版本 -
README.md
和?.gitignore
(基礎模板)
-
比如代碼main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI() ?# 創建 FastAPI 實例
# 定義根路由,返回 JSON 響應
@app.get("/")
async def hello_world():
? ? return {"message": "Hello World"}
# 可選:添加帶路徑參數的端點
@app.get("/hello/{name}")
async def greet(name: str):
? ? return {"message": f"Hello {name}"}
if __name__ == '__main__':
? ? # ?http://localhost:8001/hello/Alice
? ? uvicorn.run(app, host="127.0.0.1", port=8001)
直接添加這個包,然后uv會自動創建一個虛擬環境?
uv add??fastapi
?
會發現主依賴還有很多其他依賴。
在vscode右下角,選擇虛擬環境。(如果找不到python版本號,就重啟vscode就行)
?
4.3 導入和項目無關的包
加上 --dev參數,就會避免和主要成包混淆
uv add ruff --dev
移除依賴,比如移除ruff
uv remove ruff --dev?
把ruff當做一個tool下載到系統中
uv tool install ruff?
?
這樣子ruff這個包不在到pyproject.toml中,是一個單獨的進程自己運行
uv tool install 是系統的,每一個項目都可以用
4.4 打包成運行腳本,讓別人可以直接使用
在pyproject.toml文件中加上
[project.scripts]
腳本名稱 = "py文件:文件中的函數名"
[project.scripts]
hb_test = "main:func"
main.py是這樣的
def func(query: str):
? ? return {"query": query}
if __name__ == "__main__":
? ? func()
使用下面命令打包成一個whl文件可以讓別人下載,主要,項目架構只能有一個main.py不能有別的py文件并列
uv build
?
dist\helloworld-0.1.0-py3-none-any.whl
使用uv tool install 或uv add 方法來安裝自己發布的包
uv tool install?dist\helloworld-0.1.0-py3-none-any.whl
uv add?dist\helloworld-0.1.0-py3-none-any.whl?
查看已經安裝的工具
uv tool list?
?
使用自己的工具
# 使用剛剛寫的,腳本工具名再給對應參數直接運行,
?hb_test
# 或者這樣運行
uv tool run helloworld
這個卡住了,不知道為什么。。。用不了工具
卸載工具
uv tool uninstall 工具名
uv tool uninstall helloword?
查看包的依賴關系
uv pip tree
?
其他
虛擬環境和包
手動管理環境和包
創建虛擬環境(替換 venv 和 virtualenv):
uv venv
: 創建一個新的虛擬環境。
在環境中管理軟件包(替換 pip 和 pipdeptree):
uv pip install
: 將包安裝到當前環境。
uv pip show
: 顯示已安裝包的詳細信息。
uv pip freeze
: 列出已安裝的包及其版本。
uv pip check
: 檢查當前環境中的包是否兼容。
uv pip list
: 列出已安裝的包。
uv pip uninstall
: 卸載包。
uv pip tree
: 查看環境的依賴樹。
在環境中鎖定包(替換 pip-tools):
uv pip compile
: 將依賴項編譯到鎖文件中。
uv pip sync
: 使用鎖文件同步環境。
??對比維度?? | ?? | ?? |
---|---|---|
??主要用途?? | 項目依賴管理(記錄+鎖定) | 臨時安裝包(不修改項目配置) |
??依賴記錄?? | 寫入? | ? 不修改任何配置文件 |
??依賴鎖定?? | ? 更新? | ? 不生成/更新鎖定文件 |
??環境隔離?? | 默認安裝到項目虛擬環境 | 依賴當前激活環境(可能污染全局) |
??項目一致性?? | ? 確保團隊/環境依賴一致 | ? 無法保證版本一致性 |
??適用場景?? | 正式項目開發、協作環境 | 臨時工具安裝、調試 |
五、 參考文章
uv的出現能淘汰多少python工具……?