不知道你有没有这种感觉,学完 Python 的基础知识,想着手写一个小的 Python 项目,不知道如何下手。甚至,下载的一些开源的 Python 项目看不懂,下面就简单聊一聊 Python 项目的目录接口,如何组织 Python 项目结构才是业界推荐的标准做法。
你是不是还在随便创建一个文件夹,里面写满了各种命名的 py 文件,其实 Python 项目和 Java、C 项目一样,也需要对结构进行组织,这样才能更好的管理。
先说如何管理环境,这很重要,不要忽略了!!!
你是不是还在使用全局的 Python 解释器,什么依赖全部安装到全局环境中,就是首次从 Python 官网下载的 Python 安装包,根据提示一路安装下来的环境。
使用起来确实非常方便,如果现在你手里有两个项目,引用了同一个依赖,但是版本不同,怎么办?你首先想到的是统一两个项目的依赖版本,如果版本不能统一呢,这里推荐使用虚拟环境,类似 Linux 虚拟机环境,每个项目一个虚拟环境,各自管理各自的依赖,互不干扰。
在 Python 中,可以使用内置的 venv 模块来管理虚拟环境,你也可以使用 conda 来实现,下面将演示 venv 的用法。
注意了:venv 是 Python 3.3+ 官方内置的虚拟环境工具,不需要额外 pip 安装。
实战
打开命令行界面,执行 python -m venv venv 命令,如下:
# python -m venv 环境名称
python -m venv venv命令说明:
注意,命令执行完成后,再命令行不会输出任何信息,此时目录或多出 venv 目录。目录结构如下:

其中:
接着,激活我们创建的虚拟环境,运行 Scripts/bin 目录下面的 activate.bat(Windows),如下:

Linux/MacOS 执行 venv/bin/activate 命令(这里的 venv 是你虚拟环境目录名称),执行后的效果如下:

成功进入 venv 环境后,在使用 pip 安装依赖,是直接安装到当前 venv 环境中的,如下:

进入到 venv\Lib\site-packages 目录可以看见刚刚安装的依赖,如下图:

还可以使用 pop freeze 查看依赖的版本,如下:

当你依赖安装成功后,建议使用 pip freeze > requirements.txt 命令将当前项目所有依赖信息输出到 requirements.txt 文件,后续将项目拷贝给其他人时,可以使用 pip install -r requirements.txt 一键安装所有依赖,这就类似 Java 项目的 pom.xml 文件,将依赖集中管理,保证项目依赖的准确性。
注意,通常 venv 目录中包含了环境信息、依赖库,导致大小比较大,严禁传递到 git 仓库,给别人的代码只包含 python 脚本和 requirements.txt。
如何退出虚拟环境呢?很简单,直接运行 venv\Scripts\deactivate.bat 脚本,如下图:

退出成功,前面没有“(venv)”了。
到这里,环境知识差不多了,足够日常开发了。下面介绍项目结构:
如果你是写一些 Demo 代码,有无结构无所谓。如果你要开发一个小项目,创建良好的,符合主流推荐的项目结构还是有必要的。
如果仅是一个很小的项目,直接像下面这样组织:
your_project/
├── venv/ # 虚拟环境
├── main.py
├── utils.py
├── requirements.txt # 依赖信息
└── .gitignore注意了,推荐将 venv 和项目放在一起,一个项目一个 venv。类似前端项目、Node.js 项目的 node_modules 目录。
一些建议:
(1)venv 放在项目根目录,和源代码同级,不要嵌套在代码文件夹里面
your_project/
└── src/
├── venv/ # 禁止!不要把venv塞进源码文件夹
└── main.py(2)绝对不要把 venv 提交到 Git 仓库,可以在 .gitignore 添加“venv/”这一行,忽略 venv 目录,如下:
venv/
__pycache__/
*.pyc
*.env如果你想要更标准的项目结构,推荐一份最通用、规范的目录结构,如下:
your_project/ # 项目根目录(git仓库根目录)
├── venv/ # Python虚拟环境文件夹(自动生成,不要手动改)
├── src/ # 源代码目录(业务代码放这里)
│ ├── __init__.py
│ ├── main.py # 程序入口
│ └── utils.py
├── requirements.txt # 项目依赖清单
├── .gitignore # git忽略文件(必须写入venv/)
└── README.md如果你的项目比较大,我们还可以再 src 目录中通过文件夹进行分类、分模块,便于管理,像这样:
your_project/
├── venv/
├── src/
│ ├── __init__.py
│ ├── main.py
│ ├── api/ # API接口
│ └── service/ # 服务实现
├── tests/ # 单元测试
├── requirements.txt
├── requirements-dev.txt # 开发环境依赖(pytest、flake8等)
├── .gitignore
└── README.md下面简单复盘一下项目创建的流程:
(1)创建项目文件夹
mkdir your_project
cd your_project(2)创建虚拟环境(根目录生成venv)
python -m venv venv(3)激活环境
# Linux/macOS
source venv/bin/activate
# Windows PowerShell
venv\Scripts\activate(4)安装依赖后导出包列表
pip freeze > requirements.txt就是这么简单,学会了没有。。。。
多人协作 / 新机器拉取项目怎么用?别人从 Git 仓库克隆代码后没有 venv 文件夹,这是正常的! 只需按如下进行:
# 1、进入到项目
cd your_project
# 2、创建虚拟环境
python -m venv venv
# 3、激活环境
# Linux/macOS
source venv/bin/activate
# Windows PowerShell
venv\Scripts\activate
# 4、安装依赖
pip install -r requirements.txt注意了,不要手动一个一个的去安装依赖,直接用导出的依赖清单 requirements.txt 安装,切记切记!!
补充疑问解答:
Q:能不能把 venv 放在项目外面? A:可以,但是不方便。行业常规做法就是项目根目录下放 venv,开箱即用。
Q:多个项目怎么办? A:每个独立项目各自拥有自己根目录下的 venv,互不共用,实现环境隔离。