[虚拟环境]venv工具(介绍+使用2)

94 阅读3分钟

1/什么是 venv?

venv 是 Python 内置的虚拟环境管理模块(Python 3.3+ 版本自带),用于创建独立的 Python 环境。 每个虚拟环境都有自己的:

  • Python 解释器
  • pip 包管理器
  • 独立安装的第三方包
  • 环境变量设置

2/为什么需要 venv?

  1. 项目隔离:不同项目可以使用不同版本的包
  2. 避免冲突:防止包版本冲突
  3. 权限管理:不需要系统管理员权限安装包
  4. 环境复制:轻松复制项目环境

3/基本使用步骤

<1>创建虚拟环境

# 基本创建命令
python -m venv myenv_test1

# 指定 Python 版本(如果有多个版本)
python3.9 -m venv myenv_test1
python3.10 -m venv myenv_test1

# 指定完整路径
python -m venv /path/to/myenv

<2>激活虚拟环境

Windows (CMD/PowerShell):

# CMD
myenv_test1\Scripts\activate.bat

# PowerShell
myenv_test1Scripts\Activate.ps1
# 如果出现执行策略错误,先运行:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Mac/Linux (Bash/Zsh):

source myenv_test1/bin/activate

激活成功后,命令行提示符会显示虚拟环境名称:

(myenv_test1) user@hostname ~ $

<3>在虚拟环境中操作

# 检查 Python 位置(应指向虚拟环境)
which python
# 或 Windows: where python

# 检查 pip 位置 (应指向虚拟环境)
which pip

# 安装包(只影响当前虚拟环境, 前提是: 你得先进入该虚拟环境)
pip install numpy pandas

# 查看已安装的包
pip list

# 生成 requirements.txt
pip freeze > requirements.txt

<4>退出虚拟环境

deactivate  # 前提是: 你当前在这个环境中

4/高级创建选项

<1>创建时指定选项

# 1. 包含系统全局包(通常不推荐)
python -m venv --system-site-packages myenv

# 2. 使用符号链接而不是复制文件(节省空间)
python -m venv --symlinks myenv

# 3. 不使用符号链接(默认在Windows上)
python -m venv --copies myenv

# 4. 升级 pip、setuptools、wheel
python -m venv --upgrade-deps myenv

# 5. 指定 Python 解释器路径
python -m venv --python=/usr/bin/python3.9 myenv

# 6. 组合多个选项
python -m venv --system-site-packages --upgrade-deps myenv

<2>快速创建脚本

创建一个 create_venv.sh(Mac/Linux)或 create_venv.ps1(Windows):

Mac/Linux:

#!/bin/bash
python -m venv myenv_test1
source myenv_test1/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
echo "虚拟环境已创建并激活"

Windows PowerShell:

python -m venv myenv_test1
myenv_test1\Scripts\Activate.ps1
pip install --upgrade pip
if (Test-Path requirements.txt) {
    pip install -r requirements.txt
}
Write-Host "虚拟环境已创建并激活" -ForegroundColor Green

5/虚拟环境结构

创建后的虚拟环境的目录结构:

myenv_test1/
├── bin/                 # Mac/Linux: 可执行文件
│   ├── python           # Python 解释器
│   ├── pip              # pip 包管理器
│   └── activate         # 激活脚本
├── Scripts/             # Windows: 可执行文件
│   ├── python.exe
│   ├── pip.exe
│   └── activate.bat
├── lib/                 # 安装的包
│   └── python3.x/
│       └── site-packages/
├── include/             # C/C++ 头文件
└── pyvenv.cfg          # 配置文件

6/虚拟环境配置文件 (pyvenv.cfg)

pyvenv.cfg 文件内容示例:

home = /usr/local/bin
include-system-site-packages = false
version = 3.9.5

7/项目管理实践

<1>项目结构推荐

my_project/
├── venv/                    # 虚拟环境(.gitignore 忽略)
├── .gitignore              # 版本控制忽略文件
├── requirements.txt        # 依赖列表
├── requirements-dev.txt    # 开发依赖
├── src/                    # 源代码
│   └── app.py
└── README.md

<2>.gitignore 配置

# 虚拟环境
venv/
env/
.myenv/

# Python 缓存文件
__pycache__/
*.py[cod]
*$py.class

<3>依赖管理

# 保存依赖
pip freeze > requirements.txt

# 从文件安装依赖
pip install -r requirements.txt

# 开发依赖和生产依赖分开
# requirements.txt - 生产环境
# requirements-dev.txt - 开发环境(测试工具、代码检查等)

# 安装开发依赖
pip install -r requirements-dev.txt

8/常见问题解决

<1>"command not found: python" 错误

# 使用 python3 代替 python
python3 -m venv myenv
source myenv/bin/activate

<2>**权限问题

# 确保对目录有读写权限
chmod -R 755 myenv

# 或完全删除后重新创建
rm -rf myenv
python -m venv myenv

<3>虚拟环境无法激活

检查激活脚本是否存在:

ls -la myenv/bin/activate  # Mac/Linux
dir myenv\Scripts\Activate.ps1  # Windows

<4>跨平台兼容性

创建跨平台兼容的虚拟环境:

# 使用相对路径
python -m venv ./venv

# 在脚本中检测操作系统
if [ "$OSTYPE" = "msys" ] || [ "$OSTYPE" = "cygwin" ]; then
    # Windows
    source venv/Scripts/activate
else
    # Mac/Linux
    source venv/bin/activate
fi

9/IDE 集成

<1>VS Code

  1. 打开项目文件夹
  2. 选择解释器:Ctrl+Shift+P → "Python: Select Interpreter"
  3. 选择虚拟环境中的 Python 路径

<2>PyCharm

  1. File → Settings → Project → Python Interpreter
  2. 点击齿轮图标 → Add
  3. 选择 "Existing environment"
  4. 浏览到虚拟环境的 Python 解释器

10/自动化脚本示例

setup_project.py:

#!/usr/bin/env python3
import os
import subprocess
import sys

def create_virtual_env(env_name="venv"):
    """创建虚拟环境"""
    print(f"创建虚拟环境: {env_name}")
    
    # 检查是否已存在
    if os.path.exists(env_name):
        print(f"警告: {env_name} 已存在")
        response = input("是否删除并重新创建? (y/n): ")
        if response.lower() == 'y':
            import shutil
            shutil.rmtree(env_name)
        else:
            return
    
    # 创建虚拟环境
    subprocess.run([sys.executable, "-m", "venv", env_name])
    
    # 激活并安装基础包
    if os.name == 'nt':  # Windows
        pip_path = os.path.join(env_name, "Scripts", "pip")
    else:  # Mac/Linux
        pip_path = os.path.join(env_name, "bin", "pip")
    
    # 升级 pip
    subprocess.run([pip_path, "install", "--upgrade", "pip"])
    
    print(f"虚拟环境 {env_name} 创建成功")

if __name__ == "__main__":
    create_virtual_env()

11/最佳实践总结

  1. 每个项目单独使用虚拟环境
  2. 虚拟环境目录名通常用 venv.venv
  3. 不要将虚拟环境提交到版本控制
  4. 使用 requirements.txt 管理依赖
  5. 在运行项目前总是激活虚拟环境
  6. 定期更新虚拟环境中的包
  7. 为生产环境创建干净的虚拟环境

通过使用 venv,你可以确保 Python 项目的依赖管理和环境隔离,这是现代 Python 开发的基础技能。