使用 uv + PySide6 + PyCharm 搭建项目级 Python 桌面工具开发环境
使用 uv + PySide6 + PyCharm 搭建项目级 Python 桌面工具开发环境
1. 目标
本文记录一套适合 Python 桌面工具开发的项目环境配置流程.
目标是做到:
- 每个 Python 工程拥有独立的虚拟环境.
- 不同项目之间的 Python 包互不干扰.
- 使用
pyproject.toml描述项目依赖. - 使用
uv管理虚拟环境、依赖和 Lock 文件. - 使用 PyCharm 作为 IDE.
- 使用 PySide6 开发 Qt 桌面工具.
最终结构类似:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
计算机
│
├── Python 3.12
│
├── uv
│
└── Projects
│
├── ToolA
│ ├── pyproject.toml
│ ├── uv.lock
│ └── .venv
│
└── ToolB
├── pyproject.toml
├── uv.lock
└── .venv
核心原则是:
Python 本体可以安装在计算机上, 但项目依赖应该隔离在各自工程的
.venv中.
2. 为什么选择这套方案
2.1 为什么每个项目使用独立 .venv
不推荐把所有第三方 Python Package 都安装到同一个全局 Python 环境中.
例如:
1
2
3
4
5
6
Python 3.12
├── PySide6
├── NumPy
├── Pillow
├── ...
└── 所有项目共用
这种结构容易出现:
1
2
3
4
5
Project A
需要 Package X 1.x
Project B
需要 Package X 2.x
不同项目的依赖可能互相影响.
更合理的结构是:
1
2
3
4
5
6
7
Project A
└── .venv
└── Project A Dependencies
Project B
└── .venv
└── Project B Dependencies
每个项目独立维护自己的 Python 环境.
2.2 为什么使用 pyproject.toml
pyproject.toml 是现代 Python 项目用于描述项目配置的重要标准文件.
例如:
1
2
3
4
5
6
7
[project]
name = "unitypackagestructurer"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = [
"pyside6",
]
它可以描述:
1
2
3
4
5
项目名称
项目版本
Python 版本要求
直接依赖
其他 Python 工具配置
2.3 为什么使用 uv
传统 Python 项目常见组合是:
1
2
3
python -m venv
pip
requirements.txt
这套方式依然有效.
本文选择 uv, 是因为它可以统一处理:
1
2
3
4
5
6
虚拟环境
依赖安装
依赖解析
依赖锁定
Python Interpreter 选择
pyproject.toml 项目管理
最终形成:
1
2
3
4
5
pyproject.toml
↓
uv.lock
↓
.venv
三者职责不同.
| 对象 | 职责 |
|---|---|
pyproject.toml | 项目希望使用什么 Python 和依赖. |
uv.lock | uv 实际解析出来的精确依赖关系和版本. |
.venv | 当前计算机实际安装好的项目运行环境. |
2.4 为什么选择 PySide6
PySide6 是 Qt 的 Python Binding.
它比较适合开发:
1
2
3
4
5
6
7
技术美术工具
资产处理工具
节点编辑器
批处理工具
配置工具
调试工具
Blender 外部 Pipeline
后续如果需要开发节点编辑器, 还可以继续使用 Qt Widgets 中的:
1
2
3
QGraphicsScene
QGraphicsView
QGraphicsItem
因此 PySide6 比较适合作为长期 Python 桌面工具开发技术栈.
3. 本文使用的目录
本文实际使用以下路径.
| 对象 | 路径 |
|---|---|
Python 3.12 | D:\Dev\App\Python\Python312 |
Python 3.9 | D:\Dev\App\Python\Python39 |
uv | D:\Dev\App\Python\AstralUV |
工程 | E:\PycharmProjects\UnityPackageStructurer |
最终大致结构:
1
2
3
4
5
6
7
8
9
10
11
D:\Dev\App\Python\
├── Python312\
│ └── python.exe
│
├── Python39\
│ └── python.exe
│
└── AstralUV\
├── uv.exe
├── uvx.exe
└── uvw.exe
项目:
1
2
3
4
5
E:\PycharmProjects\UnityPackageStructurer\
├── .venv\
├── pyproject.toml
├── uv.lock
└── ...
如果实际安装路径不同, 将本文命令中的路径替换为自己的路径即可.
4. 环境配置 Checklist
按照以下顺序操作.
- 确认已有 Python 安装.
- 删除工程旧
.venv, 如果存在. - 规划
uv安装目录. - 安装
uv. - 验证
uv. - 启动 PyCharm 并打开工程.
- 打开 PyCharm Terminal 并确认当前目录.
- 将已有工程初始化为
uv项目. - 设置项目 Python 版本要求.
- 创建项目独立
.venv. - 让 PyCharm 使用现有
uv环境. - 添加 PySide6.
- 检查
pyproject.toml. - 检查
uv.lock. - 验证 PySide6.
5. 确认 Python 安装
首先确认计算机已经安装需要使用的 Python.
打开 Windows PowerShell.
本文准备使用:
1
D:\Dev\App\Python\Python312\python.exe
执行:
1
& "D:\Dev\App\Python\Python312\python.exe" --version
本文实际得到:
1
Python 3.12.0
如果机器同时安装了其他 Python, 也可以检查.
例如:
1
& "D:\Dev\App\Python\Python39\python.exe" --version
本文实际得到:
1
Python 3.9.13
后续 UnityPackageStructurer 明确使用 Python 3.12.
6. 删除旧 .venv
如果这是一个已有 Python 工程, 并且工程根目录已经存在:
1
.venv
建议先删除旧 .venv.
例如:
1
E:\PycharmProjects\UnityPackageStructurer\.venv
只删除 .venv.
不要因为删除虚拟环境而删除自己的 Python 源代码.
如果工程原本没有 .venv, 则跳过这一步.
.venv 属于本机环境生成物.
它不应该承担“描述项目依赖”的职责.
真正用于描述项目环境的是后续的:
1
2
pyproject.toml
uv.lock
7. 规划 uv 安装目录
uv 是独立的 Python 开发工具, 不属于某一个具体项目的 .venv.
本文将其安装到:
1
D:\Dev\App\Python\AstralUV
之所以使用 AstralUV 作为目录名, 是为了避免和 3D 工作中常见的 Mesh UV 概念混淆.
需要注意:
软件本身的正式名称仍然是
uv.
Astral 是它的开发方.
8. 安装 uv
打开一个普通 Windows PowerShell.
执行:
1
powershell -ExecutionPolicy ByPass -c {$env:UV\_INSTALL\_DIR = "D:\Dev\App\Python\AstralUV"; $env:UV_NO_MODIFY_PATH = "1"; irm https://astral.sh/uv/install.ps1 | iex}
其中:
1
UV_INSTALL_DIR
指定 uv 的安装位置.
而:
1
UV_NO_MODIFY_PATH = "1"
表示:
不允许安装器自动修改系统 PATH.
本文采用这种方式, 是为了让开发工具的路径完全由自己管理.
成功后应该看到类似:
1
2
3
4
5
6
downloading uv ...
installing to D:\Dev\App\Python\AstralUV
uv.exe
uvx.exe
uvw.exe
everything's installed!
最终应该得到:
1
2
3
4
D:\Dev\App\Python\AstralUV\
├── uv.exe
├── uvx.exe
└── uvw.exe
9. 验证 uv
因为上一节明确设置了:
1
UV_NO_MODIFY_PATH = "1"
所以本文不会假定系统可以直接识别:
1
uv
因此不要直接使用:
1
uv --version
而应该明确执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" --version
本文实际得到:
1
uv 0.12.5 (210d1f678 2026-08-14 x86_64-pc-windows-msvc)
只要能够正常输出版本号, 就说明 uv 安装成功.
10. 启动 PyCharm 并打开工程
完成 Python 和 uv 的准备以后, 启动 PyCharm.
在 PyCharm 启动页面选择:
1
Open
然后选择项目根目录.
本文使用:
1
E:\PycharmProjects\UnityPackageStructurer
打开以后, PyCharm 左侧 Project 面板应该显示当前工程内容.
如果之前删除了 .venv, 此时 PyCharm 可能提示:
1
未为 unitypackagestructurer 配置 Python 解释器
这是正常现象.
暂时不用处理.
因为新的 .venv 还没有创建.
11. 打开 PyCharm Terminal
在 PyCharm 窗口底部找到:
1
Terminal(终端)
打开 Terminal.
不要假定 Terminal 当前目录一定正确.
首先执行:
1
pwd
本文应该看到:
1
2
3
Path
----
E:\PycharmProjects\UnityPackageStructurer
如果当前目录不是项目根目录, 执行:
1
cd "E:\PycharmProjects\UnityPackageStructurer"
然后再次执行:
1
pwd
直到当前路径确认是:
1
E:\PycharmProjects\UnityPackageStructurer
后面的项目级命令都应该在这个目录执行.
12. 初始化 uv 项目
这里分两种情况:
1
2
3
4
5
情况 A:
已有 Python 工程, 只想把现有工程纳入 uv 管理.
情况 B:
准备创建一个全新的 Python 工程.
两种情况不要混用.
12.1 情况 A: 已有工程
如果当前目录已经存在自己的 Python 源代码、README、目录结构等内容, 不希望 uv 自动生成新的项目模板, 建议使用:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" init --bare
--bare 的目的可以理解为:
只初始化 uv 项目配置, 尽量不改动已有工程结构.
成功后通常会看到类似:
1
Initialized project `unitypackagestructurer`
工程根目录会新增:
1
pyproject.toml
例如:
1
2
3
4
5
[project]
name = "unitypackagestructurer"
version = "0.1.0"
requires-python = ">=3.14"
dependencies = []
requires-python 可能不是项目实际需要的版本, 后续还需要手动检查和修改.
12.2 情况 B: 全新工程
如果准备从零创建一个新的 Python 工程, 可以直接让 uv 初始化项目.
方式一: 已经手动创建并打开了空工程目录
例如已经在 PyCharm 中打开:
1
E:\PycharmProjects\NewTool
并且 PyCharm Terminal 当前位于:
1
E:\PycharmProjects\NewTool
可以执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" init
uv 会在当前目录中初始化一个新的 Python 项目.
与 --bare 不同, 普通 uv init 可能同时创建一些基础项目文件.
因此执行以后应该先检查工程目录, 确认生成结果是否符合自己的项目结构要求, 再继续后面的步骤.
方式二: 直接让 uv 创建新的项目目录
如果项目目录本身都还没有创建, 可以先在准备存放项目的父目录中打开 PowerShell.
例如:
1
cd "E:\PycharmProjects"
然后执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" init NewTool
这会创建类似:
1
E:\PycharmProjects\NewTool
并在其中初始化 Python 项目.
完成以后再启动 PyCharm, 选择:
1
Open
打开:
1
E:\PycharmProjects\NewTool
然后打开 PyCharm Terminal, 使用:
1
pwd
确认当前目录已经是新工程根目录.
12.3 应该选择哪一种
可以按下面判断:
1
2
3
4
5
6
7
8
9
已有代码和目录结构
↓
uv init --bare
全新空工程
↓
uv init
连工程目录都没有
↓
uv init ProjectName
对于本文示例的 UnityPackageStructurer, 因为它原本已经存在代码和目录结构, 所以使用的是:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" init --bare
而不是普通的:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" init
13. 设置项目 Python 版本
使用 PyCharm 打开:
1
pyproject.toml
本文希望这个项目明确使用 Python 3.12 系列.
因此将:
1
requires-python = ">=3.14"
修改为:
1
requires-python = ">=3.12,<3.13"
最终:
1
2
3
4
5
[project]
name = "unitypackagestructurer"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = []
这里使用:
1
>=3.12,<3.13
意味着:
1
2
允许 Python 3.12.x
不允许 Python 3.13 及更高版本
这样可以防止未来环境中安装了 Python 3.13 或 3.14 后, 项目在没有明确确认的情况下自动切换到更高 Python 版本.
14. 创建项目独立 .venv
确保当前仍然位于 PyCharm Terminal.
再次确认:
1
pwd
应该显示:
1
E:\PycharmProjects\UnityPackageStructurer
然后执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" venv --python "D:\Dev\App\Python\Python312\python.exe"
这里明确告诉 uv:
使用已经安装好的
D:\Dev\App\Python\Python312\python.exe创建虚拟环境.
这样不会依赖 uv 自己选择其他 Python.
成功后应该看到类似:
1
2
3
Using CPython 3.12.0 interpreter at: D:\Dev\App\Python\Python312\python.exe
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate
现在项目根目录应该出现:
1
.venv
即:
1
E:\PycharmProjects\UnityPackageStructurer\.venv
现在可以理解为:
1
2
3
4
5
6
7
8
D:\Dev\App\Python\Python312\python.exe
↓
机器安装的基础 Python
E:\PycharmProjects\UnityPackageStructurer\.venv
↓
当前项目自己的 Python 环境
15. 在 PyCharm 中配置现有 uv 环境
创建 .venv 后, PyCharm 可能仍然显示:
1
未为 unitypackagestructurer 配置 Python 解释器
这是因为:
.venv已经存在, 但 PyCharm 还不知道应该使用它.
15.1 打开添加 Python Interpreter 界面
可以直接点击 PyCharm 提示栏中的:
1
未为 unitypackagestructurer 配置 Python 解释器 提示 中的 "添加解释器"
或者进入:
1
2
3
4
5
File(文件)
→ Settings(设置)
→ Python
→ Interpreter(解释器)
→ Add Interpreter(添加解释器)
不同版本 PyCharm 的具体文字可能略有区别.
15.2 环境选择“选择现有”
点击Add Interpreter(添加解释器)会打开添加 Python 解释器窗口.
此时, 将:
1
环境
设置为:
1
选择现有
不要选择:
1
生成新的
因为 .venv 已经由 uv 创建完成.
15.3 类型选择 uv
将:
1
类型
选择为:
1
uv
PyCharm 默认可能显示:
1
Python
需要从下拉列表中改为:
1
uv
这里选择 uv, 是为了让 PyCharm 明确知道该项目环境由 uv 管理.
15.4 指定 uv.exe
接下来要指定:
1
uv 的路径
点击右侧文件选择按钮.
选择:
1
D:\Dev\App\Python\AstralUV\uv.exe
注意:
不要让 PyCharm 另外下载或安装一份
uv.
我们已经有自己规划好的 uv.
15.5 选择已有 .venv
指定正确的 uv.exe 后, PyCharm 应该能够识别当前工程的 .venv.
应该能够看到类似:
1
2
3
Python 3.12
E:\PycharmProjects\UnityPackageStructurer\.venv\Scripts\python.exe
并且该环境会被标记为:
1
uv
确认路径正确后点击:
1
确定
15.6 检查 PyCharm 状态
配置完成以后:
1
未配置 Python 解释器
提示应该消失.
重新打开或者观察 PyCharm Terminal 时, 提示符前可能出现:
1
(UnityPackageStructurer)
例如:
1
(UnityPackageStructurer) PS E:\PycharmProjects\UnityPackageStructurer>
这说明当前 Terminal 已经激活项目虚拟环境.
16. 添加 PySide6
现在开始给当前项目添加 PySide6.
在 PyCharm 中打开:
1
Terminal
确认当前目录:
1
pwd
应该仍然是:
1
E:\PycharmProjects\UnityPackageStructurer
然后执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" add pyside6
注意:
本文没有把 uv 添加到 PATH.
因此本文所有实际需要执行的 uv 命令都使用:
1
D:\Dev\App\Python\AstralUV\uv.exe
的完整路径.
不要改写成:
1
uv add pyside6
否则当前系统会因为找不到全局 uv 命令而报错.
本文实际安装时得到:
1
2
Resolved 5 packages in 3ms
Checked 4 packages in 2ms
只要没有出现错误信息, 即可继续检查结果.
17. 检查 pyproject.toml
执行上一节的:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" add pyside6
以后, 打开:
1
pyproject.toml
其中的:
1
dependencies = []
应该已经发生变化.
例如类似:
1
2
3
4
5
6
7
[project]
name = "unitypackagestructurer"
version = "0.1.0"
requires-python = ">=3.12,<3.13"
dependencies = [
"pyside6>=...",
]
具体版本约束以当前 uv 实际写入内容为准.
18. 检查 uv.lock
这一节不需要执行新的命令.
在第 16 节执行:
1
& "D:\Dev\App\Python\AstralUV\uv.exe" add pyside6
以后, 查看工程根目录.
应该出现:
1
uv.lock
例如:
1
2
3
4
5
UnityPackageStructurer/
├── .venv/
├── pyproject.toml
├── uv.lock
└── ...
uv.lock 用来记录 uv 实际解析得到的依赖关系和版本.
可以理解成:
1
2
3
4
5
6
7
8
9
10
11
12
pyproject.toml
↓
声明:
项目需要 PySide6
uv.lock
↓
记录:
实际解析出的 PySide6 版本
实际解析出的 Shiboken6 版本
其他间接依赖版本
因此:
1
pyproject.toml
更像是“项目要求”.
而:
1
uv.lock
更像是“这套要求经过依赖解析后的确定结果”.
19. 验证 PySide6
现在验证当前项目环境是否真的可以加载 PySide6.
打开 PyCharm Terminal.
如果已经正确配置 Interpreter, 终端前面可能显示:
1
(UnityPackageStructurer)
执行:
1
python -c "import PySide6; print(PySide6.__version__)"
这里可以直接使用:
1
python
是因为当前 PyCharm Terminal 已经激活:
1
UnityPackageStructurer\.venv
此时:
1
python
实际指向的是当前项目 .venv 中的 Python.
本文实际得到:
1
6.11.2
说明 PySide6 已经成功安装并且可以正常导入.
20. 最终环境关系
完成以后, 整个环境可以理解为:
1
2
3
4
5
6
7
8
9
D:\Dev\App\Python\
│
├── Python312\
│ └── python.exe
│
└── AstralUV\
├── uv.exe
├── uvx.exe
└── uvw.exe
以及:
1
2
3
4
5
6
7
8
9
10
11
E:\PycharmProjects\
└── UnityPackageStructurer\
│
├── .venv\
│ └── Scripts\
│ └── python.exe
│
├── pyproject.toml
├── uv.lock
│
└── 项目代码...
它们的职责分别是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Python312
↓
机器安装的基础 Python Interpreter
AstralUV
↓
Python 项目、环境和依赖管理工具
pyproject.toml
↓
描述项目和直接依赖要求
uv.lock
↓
保存实际解析后的依赖结果
.venv
↓
当前项目独立的 Python 运行环境
PyCharm
↓
IDE
使用当前项目的 .venv 进行代码补全、运行和调试
21. 为什么不把 uv 加入 PATH
本文安装 uv 时明确使用了:
1
UV_NO_MODIFY_PATH = "1"
因此:
1
uv --version
以及:
1
uv add pyside6
在普通 PowerShell 中会出现类似:
1
无法将“uv”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
这是预期行为, 不是安装失败.
本文选择这种做法, 是因为希望开发工具安装路径完全可控.
因此所有 uv 操作统一使用完整路径.
例如:
1
2
3
4
& "D:\Dev\App\Python\AstralUV\uv.exe" --version
& "D:\Dev\App\Python\AstralUV\uv.exe" init --bare
& "D:\Dev\App\Python\AstralUV\uv.exe" venv --python "D:\Dev\App\Python\Python312\python.exe"
& "D:\Dev\App\Python\AstralUV\uv.exe" add pyside6
这样不会依赖系统 PATH 中是否存在 uv.
22. 哪些东西应该跟随工程
对于 Git 等版本管理系统, 可以将项目环境理解成两部分.
应该跟随工程
1
2
3
4
5
pyproject.toml
uv.lock
Python 源代码
资源文件
配置文件
这些文件用于描述和构成项目.
不应该依赖复制的本地环境
1
.venv
.venv 应该在每台机器上重新创建.
例如换了一台机器后, 不应该直接复制旧电脑上的:
1
.venv
而应该重新根据项目配置建立环境.
23. 推荐的 .gitignore
项目使用 Git 时, 建议至少忽略:
.venv/
__pycache__/
*.pyc
PyCharm 的:
1
.idea/
是否提交可以根据团队自己的 JetBrains 项目配置策略决定.
如果不希望保存本机 IDE 配置, 也可以加入:
.idea/
24. 新电脑重新配置时的思路
换电脑以后, 正确恢复流程是:
1
2
3
4
5
6
7
8
9
10
11
12
13
安装基础 Python
↓
安装 uv
↓
Clone / Copy 项目
↓
使用 uv 创建新的项目 .venv
↓
恢复项目依赖
↓
打开 PyCharm
↓
让 PyCharm 指向新的 .venv
不要复制另一台电脑生成的:
1
.venv
项目环境应该根据:
1
2
3
pyproject.toml
+
uv.lock
重新建立.
25. 本文实际验证版本
本文实际配置和验证使用:
1
2
3
Python 3.12.0
uv 0.12.5
PySide6 6.11.2
实际路径:
1
2
3
4
5
6
7
8
Python:
D:\Dev\App\Python\Python312\python.exe
uv:
D:\Dev\App\Python\AstralUV\uv.exe
Project:
E:\PycharmProjects\UnityPackageStructurer
Project Virtual Environment:
E:\PycharmProjects\UnityPackageStructurer\.venv
这些版本只是本文实际验证环境.
如果以后使用更新版本, 操作界面或输出文字可能略有不同.
26. 最终检查 Checklist
完成全部操作后, 可以逐项检查:
- Python 3.12 可以通过绝对路径正常运行.
uv.exe位于自己规划的目录.- 使用
uv.exe完整路径可以正常显示版本号. - PyCharm 已经打开正确的工程根目录.
- PyCharm Terminal 的当前目录是工程根目录.
- 工程根目录存在
pyproject.toml. requires-python已设置为需要的 Python 版本范围.- 工程根目录存在
.venv. .venv基于指定 Python 3.12 创建.- PyCharm Interpreter 类型选择了
uv. - PyCharm 使用的是项目自己的
.venv. - PyCharm 中已经指定正确的
uv.exe. - PySide6 已通过完整
uv.exe路径添加. pyproject.toml中存在 PySide6 依赖.- 工程根目录存在
uv.lock. import PySide6可以正常执行.PySide6.__version__可以正常输出.
全部通过以后, Python + uv + PyCharm + PySide6 的项目级开发环境就已经配置完成.
接下来即可开始正式开发 PySide6 / Qt 桌面工具.
