搭建开发环境:Python环境配置、必要的库安装、项目目录结构设计

好,咱们正式开始动手了。这一章其实没什么高深的技术,但却是整个项目的地基。我见过太多人一上来就写代码,结果环境没配好,折腾半天连个Hello World都跑不出来。咱们别犯这个错,一步一个脚印来。

Python环境配置

我个人习惯用Python 3.10以上的版本。为什么?因为新版本对类型提示支持更好,咱们写GPU模拟器时类型标注能省不少事。你想想看,一个寄存器几百个字段,没有类型提示,回头自己都看不懂。

先检查你的Python版本:

python --version

如果版本低于3.8,我建议你升级一下。我曾经在3.6上踩过坑——有些语法特性不支持,改代码改到怀疑人生。

推荐用虚拟环境。别嫌麻烦,这是好习惯:

python -m venv gpu_sim_env
source gpu_sim_env/bin/activate  # Linux/Mac
# 或者 Windows 下:
# gpu_sim_env\Scripts\activate

虚拟环境的好处是:项目之间互不干扰。你装再多的库,也不会把系统Python搞乱。

必要的库安装

咱们这个项目主要依赖两个库:NumPy和Pygame。说白了,一个管计算,一个管显示。

NumPy

NumPy是GPU模拟器的计算核心。为什么不用纯Python列表?因为慢。GPU模拟器要处理大量并行计算,NumPy的数组操作比Python列表快几十倍。我在做第一个版本时偷懒用了列表,结果一个简单的像素填充跑了3秒——这哪叫GPU,这叫GP慢。

pip install numpy

安装完后验证一下:

python -c "import numpy; print(numpy.__version__)"

看到版本号就对了。

Pygame

Pygame负责把GPU计算出来的画面显示到屏幕上。它其实是个游戏开发库,但用来做模拟器显示正合适——能处理窗口、键盘事件、像素缓冲区。

pip install pygame

验证:

python -c "import pygame; print(pygame.ver)"

注意:如果你在Linux上安装Pygame,可能需要先装SDL依赖库。命令是:sudo apt-get install libsdl2-dev。Windows和Mac用户一般直接装就行。

其他辅助库

还有一些小工具,不是必须的,但我建议装上:

  • pytest:写单元测试用。GPU模拟器逻辑复杂,没有测试心里没底。
  • black:代码格式化工具。团队协作时统一风格。
pip install pytest black

项目目录结构设计

嗯,这里要注意。目录结构决定了你后面30章能不能写得顺手。我见过最惨的项目——所有代码堆在一个文件里,一万多行,改个bug要找半小时。

咱们的项目结构是这样的:

gpu_simulator/
├── src/
│   ├── __init__.py
│   ├── core/           # 核心模拟器
│   │   ├── __init__.py
│   │   ├── gpu.py      # GPU主控
│   │   ├── shader.py   # 着色器单元
│   │   └── memory.py   # 显存管理
│   ├── display/        # 显示模块
│   │   ├── __init__.py
│   │   └── renderer.py # 渲染器
│   └── utils/          # 工具函数
│       ├── __init__.py
│       └── helpers.py
├── tests/              # 测试代码
│   ├── test_gpu.py
│   └── test_shader.py
├── examples/           # 示例程序
│   └── triangle.py
├── requirements.txt    # 依赖清单
└── README.md

为什么这么分?我解释一下:

  • core/:放GPU的核心逻辑。包括指令执行、寄存器管理、内存访问。这部分是模拟器的心脏。
  • display/:只管显示。从core拿到像素数据,用Pygame画出来。职责单一,好维护。
  • utils/:放一些通用函数,比如二进制转换、位操作。这些小工具到处都能用。
  • tests/:测试代码单独放。我习惯每个模块对应一个测试文件,找问题快。

小技巧:每个目录下都放一个空的__init__.py文件。这样Python才能把目录当成包来导入。我刚开始学Python时忘了这个,折腾了半天import失败。

创建requirements.txt

这个文件记录所有依赖,方便别人一键安装:

numpy>=1.24.0
pygame>=2.5.0
pytest>=7.0.0
black>=23.0.0

安装时只需要:

pip install -r requirements.txt

验证环境

写个简单的测试脚本,确保一切正常:

# test_env.py
import numpy as np
import pygame

# 测试NumPy
arr = np.array([1, 2, 3, 4])
print(f"NumPy works: {arr.sum()}")

# 测试Pygame
pygame.init()
print(f"Pygame version: {pygame.ver}")
pygame.quit()

print("Environment is ready!")

跑一下:

python test_env.py

看到输出就说明环境搭好了。

避坑指南

最后分享几个我踩过的坑:

  • 路径问题:别在项目根目录下直接写代码。把代码放在src/里,用相对路径导入。我曾经把所有文件平铺在根目录,后来项目大了,找文件像大海捞针。
  • 版本冲突:如果你同时做多个Python项目,一定要用虚拟环境。我有个同事没隔离环境,结果一个项目要NumPy 1.19,另一个要1.24,最后两个都跑不起来。
  • 编码问题:Windows用户注意,文件路径里别用中文。Pygame在某些中文路径下会报错。我吃过这个亏,后来所有项目都用英文命名。

好了,环境搭好了,目录结构也清楚了。下一章咱们就开始写GPU模拟器的核心——指令集架构。到时候你会看到,这些准备工作有多重要。