目录
1. 先理解差别
一句话:venv是python的一部分,只服务于python,隔离python环境;anaconda大集成者,不限于python语言,不限于平台,支持Windows、Linux和macOS等多个操作系统。
1.1 来源和适用性
- venv:venv是Python的标准库中提供的模块,从Python 3.3版本开始引入。它是Python官方推荐的创建和管理虚拟环境的工具,适用于任何Python安装。
- Anaconda:Anaconda是一个跨平台的Python发行版,提供了用于科学计算和数据分析的大量库和工具。它包含了Python解释器以及一个名为conda的包管理器,可以用于创建和管理虚拟环境。
1.2 功能和生态系统
- venv:venv模块主要用于创建和管理Python虚拟环境,它提供了创建虚拟环境、安装包、管理依赖项等基本功能。venv本身并不提供额外的科学计算或数据分析工具。
- Anaconda:Anaconda是一个完整的Python发行版,包含了大量的科学计算和数据分析工具,如NumPy、Pandas、Matplotlib等。它提供了conda包管理器,可以用于创建和管理虚拟环境,并且可以方便地安装、更新和管理各种包和依赖项。
1.3 包管理器
- venv:venv使用Python的标准包管理器pip来安装和管理包。你可以在虚拟环境中使用pip来安装、更新和删除包。
- Anaconda:Anaconda使用其自带的包管理器conda来安装和管理包。conda可以管理Python包以及其他非Python软件包,并提供了更复杂的依赖项解析和环境管理功能。
1.4 跨平台支持
- venv:
- venv是Python的标准库,因此它在所有支持Python的平台上都可以使用,包括Windows、Linux和macOS等。
- Anaconda:
- 跨平台:Anaconda是一个跨平台的发行版,支持Windows、Linux和macOS等多个操作系统。
- 多功能性: Conda 可以管理包和环境。它可以处理多种语言并且不限于Python。
- 强大的包管理:可以安装Python包,也可以安装其他语言的包。
- 环境管理: Conda 环境可以包含 Python 和非 Python 依赖项。
1.5 选择时机
何时使用 Venv
以 Python 为中心的项目:如果您的项目是纯 Python 的,那么 venv 通常就足够了。
轻量级需求:对于较小的项目或当您想让事情变得简单明了时。
标准 Python 发行版:如果您使用标准 Python 发行版并且不需要 Anaconda 附带的附加包。
何时选择Conda
复杂的依赖关系:如果您的项目涉及复杂的依赖关系网络,尤其是非 Python 的依赖关系,那么 Conda 是您的首选。
数据科学和分析: Conda 在数据科学界很受欢迎,这要归功于它与数据科学包的无缝集成。
跨平台开发:如果您正在跨平台开发并需要一致的环境管理,Conda 非常有效。
1.6 主要差异
范围: Venv 是 Python 独有的,而 Conda 是与语言无关的。
包管理: Venv 本身不处理包依赖关系,而 Conda 在这方面表现出色。
安装: Venv是Python的一部分,但Conda需要单独安装,与Anaconda或Miniconda一起提供。
2. venv使用
2.1 前言
创建python虚拟环境 和 创建python项目目录文件代码,本身是相互不干扰的,独立的。
但是由于我们用开发工具开发python项目的时候,要指定用那个python虚拟环境。
故而,我们通常会把venv创建的虚拟环境位置放到项目目录下,这样便于操作。
假设我们有一个项目目录结构如下
/opt/myproject/
├── venv/ # ✅ 虚拟环境目录(存放 Python 依赖,不包含在版本版本控制中,如git)
├── app.py # 项目主文件
├── requirements.txt # 依赖文件
├── config/ # 配置文件目录
├── logs/ # 日志文件目录
├── static/ # 静态文件
└── templates/ # 模板文件(如果是 Web 项目)
myproject/
│
├── venv/ # 虚拟环境目录(不包含在版本控制中)
│
├── src/ # 源代码目录
│ └── my_module.py # 你的Python模块或包
│
├── tests/ # 测试代码目录
│ └── test_my_module.py # 测试文件
│
├── requirements.txt # 项目依赖文件
│
├── README.md # 项目说明文件
│
└── setup.py # 项目设置文件(如果是包的话)
myproject/
│
├── my_project/ # 你的项目代码
│ ├── __init__.py # 使得my_project成为一个Python包
│ ├── module1.py # 模块1
│ ├── module2.py # 模块2
│ └── ... # 其他模块
│
├── tests/ # 测试代码
│ ├── __init__.py
│ ├── test_module1.py # 测试module1
│ └── test_module2.py # 测试module2
│
├── venv/ # 虚拟环境目录
│ └── ... # venv包含的所有文件和子目录
│
├── requirements.txt # 项目依赖
├── README.md # 项目说明文档
├── .gitignore # git忽略文件配置
└── setup.py # 项目设置文件(如果需要发布包的话)
ProjectName # 项目的根目录,通常情况下也是项目名称。
|-- .venv # 为项目配置的虚拟环境。可通过命令python3 -m venv .venv 创建。
|-- .vscode # VSCode IDE所特有,用于配置python项目运行调试的基本信息。
| |-- launch.json
| |-- setting.json
|-- api # 将src中的模块封装为直接调用的API。
| |-- module1_api.py
| |-- module2_api.py
|-- bin # 脚本目录,如规模化执行或多功能合并执行的脚本文件(含shell脚本)。
| |-- execute.sh
| |-- execute.py
|-- configs # 配置文件目录,如数据库配置、API地址配置等。
| |-- database.properties
|-- data # 数据存放目录,如项目运行过程中的输入输出数据。
|-- docs # 项目文档目录,如设计方案、项目结构(模块功能)说明、使用说明等。
|-- LICENSE # 许可证信息存放目录,也可以是许可证文件。
|-- log # 日志存放目录。
|-- src # 包含项目源代码的根目录。该目录下的所有子目录通常作为不同功能的模块:
| |-- __init__.py # 用于标识目录为Python包
| |-- conf # 项目配置目录,所有的静态参数、文件路径、数据库配置等全部放在该目录下。
| | |-- __init__.py
| | |-- settings.py
| |-- common # 公共文件目录,存放公共组件函数,如:加密、序列化、日志配置、工具等。
| | |-- __init__.py
| | |-- encryption.py
| | |-- utils.py
| | |-- log.py
| |-- module1 # 与业务逻辑相关的模块。
| | |-- __init__.py
| | |-- module1_file1.py
| | |-- module1_file2.py
| |-- module2 # 与业务逻辑相关的模块。
| | |-- __init__.py
| | |-- module2_file1.py
| | |-- module2_file2.py
|-- tests # 测试模块,用于项目业务逻辑模块及其他功能模块的测试模块。
| |-- test_module1.py
| |-- test_module2.py
|-- .gitignore # Git版本管理配置文件,项目中无需提交的代码文件、目录、日志文件等均需在此标明。
|-- main.py
|-- README.md
|-- requirements.txt # 项目的依赖包列表,方便其他人或CI/CD工具安装依赖。
|-- setup.py # 项目的元数据和构建信息,用于打包和分发。
2.2 创建虚拟环境
1. 命令行进入到项目所在目录
cd: xxxxx/myproject
2. 创建虚拟环境
python -m venv myenv2
这将创建一个名为myenv
的虚拟环境。你可以根据项目的需要将myenv
替换为其他名称。不通的名称,对应的创建的虚拟环境目录名也不一样3
如果你更喜欢使用virtualenv
,可以通过以下命令安装并创建虚拟环境:
pip install virtualenv
virtualenv myenv2
virtualenv
与venv
相比,提供了一些额外的功能和兼容性,但两者的使用方式类似。
2.3 激活虚拟环境
Windows环境下
在命令行执行(当前项目目录下): 上一步创建的虚拟环境目录名/Scripts\activate
myenv2\Scripts\activate
有时候命令行权限问题,运行上述脚本错误
需要切换到管理员命令行模式
macOS 和 Linux
source myenv2/bin/activate
激活后,命令行前面会出现 (venv),表示虚拟环境已启用:
# window命令行
(myenv2) D:\GiteeDownloadProject\TransBigDataStudyProject>
# linux或者macos
(myenv2) user@server:/opt/myproject$
2.4 安装项目依赖
1. 有requirements.txt安装
在激活虚拟环境后,所有的包安装操作都会在该环境中进行。通常,项目的依赖项会列在requirements.txt
文件中,可以使用以下命令安装所有依赖项:
pip install -r requirements.txt
2. 单独安装包
pip install numpy
3. 更新 requirements.txt
在项目开发过程中,依赖库可能会发生变化。因此,定期更新requirements.txt
文件是很重要的。可以使用以下命令生成或更新requirements.txt
:
pip freeze > requirements.txt
这将列出所有当前虚拟环境中安装的包及其版本,并将它们写入requirements.txt
文件。
2.5 管理虚拟环境包依赖
1. 查看已安装包
为了查看当前虚拟环境中已安装的包,可以使用以下命令:
pip list
2. 添加新包
安装新的包时,只需确保虚拟环境处于激活状态,然后使用pip install
命令。例如:
pip install requests
3. 移除包
如果需要卸载某个包,可以使用以下命令:
pip uninstall package_name
4. 保存和下载依赖
如果你想要在其他项目中套用当前项目的依赖,则首先需要对当前项目的依赖进行保存,在虚拟环境中运行如下命令以进行保存:
pip freeze > requirements.txt
这条命令将虚拟环境下安装的所有库以及库的版本信息保存到当前目录下的requirements.txt文件里,格式如下
anyio==4.9.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
asttokens==3.0.0
async-lru==2.0.5
attrs==25.3.0
babel==2.17.0
beautifulsoup4==4.13.4
bleach==6.2.0
certifi==2025.4.26
cffi==1.17.1
charset-normalizer==3.4.1
colorama==0.4.6
comm==0.2.2
contourpy==1.3.2
cycler==0.12.1
debugpy==1.8.14
decorator==5.2.1
defusedxml==0.7.1
deprecation==2.1.0
exceptiongroup==1.2.2
executing==2.2.0
fastjsonschema==2.21.1
fonttools==4.57.0
fqdn==1.5.1
geoarrow-c==0.1.2
geoarrow-pandas==0.1.1
geoarrow-pyarrow==0.1.2
将
requirements.txt
文件纳入版本控制,以确保团队成员能够轻松地安装相同的依赖版本。
2.5 虚拟环境运行 Python 程序
1. 命令行运行
在虚拟环境中,可以直接运行 Python 程序:
python my_script.py
这里的 python 会指向虚拟环境中的 Python 解释器。
2. 在IDE中指定虚拟环境
1. PyCharm
- 打开项目设置(File > Settings)。
- 导航到Project: [project_name] > Python Interpreter。
- 点击齿轮图标,选择 "Add… "。
- 选择 "Existing environment",并指定虚拟环境的解释器路径,例如
myenv/bin/python
。
2. VSCode
- 打开命令面板(Ctrl+Shift+P)。
- 选择 "Python: Select Interpreter"。
- 选择虚拟环境的解释器路径。
2.6 退出虚拟环境
在 Python 虚拟环境(venv)中,如果你想退出虚拟环境,只需运行以下命令:
# window或者linux都可以直接命令行执行
deactivate
运行前后结果
# -----------进入虚拟环境-----------
# window命令行
(myenv2) D:\GiteeDownloadProject\TransBigDataStudyProject>
# linux或者macos
(myenv2) user@server:/opt/myproject$
# -----------退出虚拟环境-----------
# 执行
deactivate
# 执行后,命令行前面的 (myenv2) 就会消失,表示已退出虚拟环境
# window命令行
D:\GiteeDownloadProject\TransBigDataStudyProject>
# linux或者macos
user@server:/opt/myproject$
2.7 删除虚拟环境(如有需要)
直接手动删除myenv2文件夹(简单粗暴)
2.8 应用场景
1. 项目隔离
在多个项目中使用虚拟环境,可以确保每个项目拥有独立的依赖,不同项目间不会发生版本冲突。例如,你的项目 A 使用的是 requests==2.32.3,而项目 B 使用的是 requests==2.25.1,两者之间不会相互干扰。
2. 依赖管理
通过 venv 和 requirements.txt,可以轻松地将所有依赖库的版本信息记录下来,并在不同环境中重现相同的开发或生产环境,保证项目的可移植性和一致性。
3. 开发和生产环境的切换
你可以为开发和生产环境创建不同的虚拟环境,以避免开发过程中使用的库与生产环境中的库发生冲突。这种方式有助于确保生产环境的稳定性。