Skip to content

虚拟环境示例

本页面提供了详细的虚拟环境管理示例,展示如何使用 Go Pip SDK 创建、管理和使用 Python 虚拟环境。

基本虚拟环境操作

创建和激活虚拟环境

go
package main

import (
    "fmt"
    "log"
    "path/filepath"
    "github.com/scagogogo/go-pip-sdk/pkg/pip"
)

func basicVenvOperations() {
    manager := pip.NewManager(nil)
    venvPath := filepath.Join(".", "my-project-env")
    
    // 创建虚拟环境
    fmt.Println("创建虚拟环境...")
    if err := manager.CreateVenv(venvPath); err != nil {
        log.Fatalf("创建虚拟环境失败: %v", err)
    }
    fmt.Println("✅ 虚拟环境创建成功")
    
    // 激活虚拟环境
    fmt.Println("激活虚拟环境...")
    if err := manager.ActivateVenv(venvPath); err != nil {
        log.Fatalf("激活虚拟环境失败: %v", err)
    }
    fmt.Println("✅ 虚拟环境已激活")
    
    // 检查虚拟环境状态
    isActive, activePath := manager.IsVenvActive()
    if isActive {
        fmt.Printf("当前虚拟环境: %s\n", activePath)
    }
    
    // 在虚拟环境中安装包
    pkg := &pip.PackageSpec{Name: "requests"}
    if err := manager.InstallPackage(pkg); err != nil {
        log.Printf("安装包失败: %v", err)
    } else {
        fmt.Println("✅ 在虚拟环境中安装包成功")
    }
    
    // 停用虚拟环境
    fmt.Println("停用虚拟环境...")
    if err := manager.DeactivateVenv(); err != nil {
        log.Printf("停用虚拟环境失败: %v", err)
    } else {
        fmt.Println("✅ 虚拟环境已停用")
    }
}

使用自定义选项创建虚拟环境

go
func createVenvWithOptions() {
    manager := pip.NewManager(nil)
    
    // 高级虚拟环境选项
    opts := &pip.VenvOptions{
        PythonVersion:      "3.9",
        SystemSitePackages: false,
        Prompt:             "my-project",
        UpgradePip:         true,
        InstallSetuptools:  true,
        InstallWheel:       true,
        Clear:              false,
    }
    
    venvPath := "./advanced-env"
    fmt.Println("使用自定义选项创建虚拟环境...")
    
    if err := manager.CreateVenvWithOptions(venvPath, opts); err != nil {
        log.Fatalf("创建虚拟环境失败: %v", err)
    }
    
    fmt.Println("✅ 高级虚拟环境创建成功")
    
    // 获取虚拟环境信息
    info, err := manager.GetVenvInfo(venvPath)
    if err != nil {
        log.Printf("获取虚拟环境信息失败: %v", err)
        return
    }
    
    fmt.Printf("环境信息:\n")
    fmt.Printf("  名称: %s\n", info.Name)
    fmt.Printf("  Python 版本: %s\n", info.PythonVersion)
    fmt.Printf("  Pip 版本: %s\n", info.PipVersion)
    fmt.Printf("  创建时间: %s\n", info.CreatedAt.Format("2006-01-02 15:04:05"))
}

虚拟环境管理

列出和管理多个虚拟环境

go
func manageMultipleVenvs() {
    manager := pip.NewManager(nil)
    
    // 创建多个虚拟环境
    envConfigs := []struct {
        name    string
        python  string
        purpose string
    }{
        {"web-dev", "3.9", "Web 开发环境"},
        {"data-science", "3.8", "数据科学环境"},
        {"testing", "3.10", "测试环境"},
    }
    
    fmt.Println("创建多个虚拟环境...")
    for _, config := range envConfigs {
        venvPath := filepath.Join("./envs", config.name)
        
        opts := &pip.VenvOptions{
            PythonVersion: config.python,
            Prompt:        config.name,
            UpgradePip:    true,
        }
        
        fmt.Printf("创建 %s (%s)...\n", config.name, config.purpose)
        if err := manager.CreateVenvWithOptions(venvPath, opts); err != nil {
            fmt.Printf("❌ 创建 %s 失败: %v\n", config.name, err)
            continue
        }
        fmt.Printf("✅ %s 创建成功\n", config.name)
    }
    
    // 列出所有虚拟环境
    fmt.Println("\n列出所有虚拟环境:")
    venvs, err := manager.ListVenvs("./envs")
    if err != nil {
        log.Printf("列出虚拟环境失败: %v", err)
        return
    }
    
    fmt.Printf("找到 %d 个虚拟环境:\n", len(venvs))
    for _, venv := range venvs {
        fmt.Printf("- %s (Python %s, %d 个包)\n", 
            venv.Name, venv.PythonVersion, venv.PackageCount)
    }
}

虚拟环境信息查询

go
func queryVenvInfo() {
    manager := pip.NewManager(nil)
    
    venvPaths := []string{
        "./envs/web-dev",
        "./envs/data-science",
        "./envs/testing",
    }
    
    for _, path := range venvPaths {
        fmt.Printf("\n=== %s ===\n", filepath.Base(path))
        
        info, err := manager.GetVenvInfo(path)
        if err != nil {
            fmt.Printf("❌ 获取信息失败: %v\n", err)
            continue
        }
        
        fmt.Printf("名称: %s\n", info.Name)
        fmt.Printf("路径: %s\n", info.Path)
        fmt.Printf("Python 版本: %s\n", info.PythonVersion)
        fmt.Printf("Pip 版本: %s\n", info.PipVersion)
        fmt.Printf("包数量: %d\n", info.PackageCount)
        fmt.Printf("环境大小: %.2f MB\n", float64(info.Size)/(1024*1024))
        fmt.Printf("创建时间: %s\n", info.CreatedAt.Format("2006-01-02 15:04:05"))
        fmt.Printf("最后使用: %s\n", info.LastUsed.Format("2006-01-02 15:04:05"))
        fmt.Printf("是否激活: %t\n", info.IsActive)
    }
}

项目特定的虚拟环境

Web 开发环境

go
func setupWebDevEnvironment() {
    manager := pip.NewManager(nil)
    venvPath := "./web-project-env"
    
    // 创建 Web 开发虚拟环境
    opts := &pip.VenvOptions{
        PythonVersion: "3.9",
        Prompt:        "web-project",
        UpgradePip:    true,
    }
    
    fmt.Println("设置 Web 开发环境...")
    if err := manager.CreateVenvWithOptions(venvPath, opts); err != nil {
        log.Fatalf("创建环境失败: %v", err)
    }
    
    if err := manager.ActivateVenv(venvPath); err != nil {
        log.Fatalf("激活环境失败: %v", err)
    }
    
    // 安装 Web 开发相关包
    webPackages := []*pip.PackageSpec{
        {Name: "fastapi", Version: ">=0.68.0"},
        {Name: "uvicorn", Version: ">=0.15.0"},
        {Name: "pydantic", Version: ">=1.8.0"},
        {Name: "sqlalchemy", Version: ">=1.4.0"},
        {Name: "alembic", Version: ">=1.7.0"},
        {Name: "pytest", Version: ">=6.0"},
        {Name: "black", Version: ">=21.0"},
        {Name: "flake8", Version: ">=3.8"},
    }
    
    fmt.Println("安装 Web 开发包...")
    for _, pkg := range webPackages {
        fmt.Printf("安装 %s...\n", pkg.Name)
        if err := manager.InstallPackage(pkg); err != nil {
            fmt.Printf("❌ 安装 %s 失败: %v\n", pkg.Name, err)
        } else {
            fmt.Printf("✅ %s 安装成功\n", pkg.Name)
        }
    }
    
    // 生成需求文件
    if err := manager.GenerateRequirements("web-requirements.txt"); err != nil {
        log.Printf("生成需求文件失败: %v", err)
    } else {
        fmt.Println("✅ Web 开发需求文件生成成功")
    }
}

数据科学环境

go
func setupDataScienceEnvironment() {
    manager := pip.NewManager(nil)
    venvPath := "./data-science-env"
    
    opts := &pip.VenvOptions{
        PythonVersion: "3.8",
        Prompt:        "data-science",
        UpgradePip:    true,
    }
    
    fmt.Println("设置数据科学环境...")
    if err := manager.CreateVenvWithOptions(venvPath, opts); err != nil {
        log.Fatalf("创建环境失败: %v", err)
    }
    
    if err := manager.ActivateVenv(venvPath); err != nil {
        log.Fatalf("激活环境失败: %v", err)
    }
    
    // 安装数据科学相关包
    dataPackages := []*pip.PackageSpec{
        {Name: "numpy", Version: ">=1.20.0"},
        {Name: "pandas", Version: ">=1.3.0"},
        {Name: "matplotlib", Version: ">=3.4.0"},
        {Name: "seaborn", Version: ">=0.11.0"},
        {Name: "scikit-learn", Version: ">=1.0.0"},
        {Name: "jupyter", Version: ">=1.0.0"},
        {Name: "ipython", Version: ">=7.0.0"},
        {Name: "plotly", Version: ">=5.0.0"},
    }
    
    fmt.Println("安装数据科学包...")
    for _, pkg := range dataPackages {
        fmt.Printf("安装 %s...\n", pkg.Name)
        if err := manager.InstallPackage(pkg); err != nil {
            fmt.Printf("❌ 安装 %s 失败: %v\n", pkg.Name, err)
        } else {
            fmt.Printf("✅ %s 安装成功\n", pkg.Name)
        }
    }
    
    fmt.Println("✅ 数据科学环境设置完成")
}

虚拟环境克隆和备份

克隆虚拟环境

go
func cloneVirtualEnvironment() {
    manager := pip.NewManager(nil)
    
    sourcePath := "./production-env"
    targetPath := "./staging-env"
    
    fmt.Printf("克隆虚拟环境从 %s%s...\n", sourcePath, targetPath)
    
    if err := manager.CloneVenv(sourcePath, targetPath); err != nil {
        log.Fatalf("克隆虚拟环境失败: %v", err)
    }
    
    fmt.Println("✅ 虚拟环境克隆成功")
    
    // 验证克隆结果
    sourceInfo, _ := manager.GetVenvInfo(sourcePath)
    targetInfo, _ := manager.GetVenvInfo(targetPath)
    
    fmt.Printf("源环境包数量: %d\n", sourceInfo.PackageCount)
    fmt.Printf("目标环境包数量: %d\n", targetInfo.PackageCount)
}

导出和导入虚拟环境

go
func exportImportVenv() {
    manager := pip.NewManager(nil)
    
    // 导出虚拟环境配置
    venvPath := "./my-project-env"
    configFile := "environment.yml"
    
    fmt.Printf("导出虚拟环境 %s%s...\n", venvPath, configFile)
    if err := manager.ExportVenv(venvPath, configFile); err != nil {
        log.Fatalf("导出虚拟环境失败: %v", err)
    }
    fmt.Println("✅ 虚拟环境导出成功")
    
    // 从配置文件导入虚拟环境
    newVenvPath := "./imported-env"
    fmt.Printf("从 %s 导入虚拟环境到 %s...\n", configFile, newVenvPath)
    if err := manager.ImportVenv(configFile, newVenvPath); err != nil {
        log.Fatalf("导入虚拟环境失败: %v", err)
    }
    fmt.Println("✅ 虚拟环境导入成功")
}

虚拟环境维护

清理和更新虚拟环境

go
func maintainVirtualEnvironments() {
    manager := pip.NewManager(nil)
    
    venvPaths := []string{
        "./web-project-env",
        "./data-science-env",
        "./testing-env",
    }
    
    for _, path := range venvPaths {
        fmt.Printf("\n维护虚拟环境: %s\n", path)
        
        // 验证虚拟环境
        issues, err := manager.ValidateVenv(path)
        if err != nil {
            fmt.Printf("❌ 验证失败: %v\n", err)
            continue
        }
        
        if len(issues) > 0 {
            fmt.Printf("发现 %d 个问题:\n", len(issues))
            for _, issue := range issues {
                fmt.Printf("- %s: %s\n", issue.Type, issue.Message)
            }
            
            // 尝试修复
            fmt.Println("尝试修复虚拟环境...")
            if err := manager.RepairVenv(path); err != nil {
                fmt.Printf("❌ 修复失败: %v\n", err)
            } else {
                fmt.Println("✅ 修复成功")
            }
        } else {
            fmt.Println("✅ 虚拟环境状态良好")
        }
        
        // 清理缓存
        fmt.Println("清理虚拟环境缓存...")
        if err := manager.CleanVenv(path); err != nil {
            fmt.Printf("❌ 清理失败: %v\n", err)
        } else {
            fmt.Println("✅ 缓存清理完成")
        }
        
        // 更新虚拟环境
        fmt.Println("更新虚拟环境...")
        if err := manager.UpdateVenv(path); err != nil {
            fmt.Printf("❌ 更新失败: %v\n", err)
        } else {
            fmt.Println("✅ 更新完成")
        }
    }
}

清理旧的虚拟环境

go
func cleanupOldEnvironments() {
    manager := pip.NewManager(nil)
    baseDir := "./envs"
    
    fmt.Println("查找旧的虚拟环境...")
    venvs, err := manager.ListVenvs(baseDir)
    if err != nil {
        log.Fatalf("列出虚拟环境失败: %v", err)
    }
    
    cutoff := time.Now().AddDate(0, 0, -30) // 30 天前
    var toDelete []string
    
    for _, venv := range venvs {
        if venv.LastUsed.Before(cutoff) {
            toDelete = append(toDelete, venv.Path)
        }
    }
    
    if len(toDelete) == 0 {
        fmt.Println("没有找到需要清理的旧环境")
        return
    }
    
    fmt.Printf("找到 %d 个超过 30 天未使用的环境:\n", len(toDelete))
    for _, path := range toDelete {
        fmt.Printf("- %s\n", path)
    }
    
    fmt.Print("是否删除这些环境? (y/N): ")
    var response string
    fmt.Scanln(&response)
    
    if strings.ToLower(response) == "y" {
        for _, path := range toDelete {
            fmt.Printf("删除 %s...\n", path)
            if err := manager.RemoveVenv(path); err != nil {
                fmt.Printf("❌ 删除失败: %v\n", err)
            } else {
                fmt.Printf("✅ 删除成功\n")
            }
        }
    }
}

批量虚拟环境操作

批量创建虚拟环境

go
func batchCreateVenvs() {
    manager := pip.NewManager(nil)
    
    configs := []*pip.VenvConfig{
        {Path: "./envs/python38", PythonVersion: "3.8"},
        {Path: "./envs/python39", PythonVersion: "3.9"},
        {Path: "./envs/python310", PythonVersion: "3.10"},
    }
    
    fmt.Printf("批量创建 %d 个虚拟环境...\n", len(configs))
    
    if err := manager.CreateMultipleVenvs(configs); err != nil {
        log.Fatalf("批量创建失败: %v", err)
    }
    
    fmt.Println("✅ 批量创建完成")
}

批量删除虚拟环境

go
func batchRemoveVenvs() {
    manager := pip.NewManager(nil)
    
    paths := []string{
        "./old-env1",
        "./old-env2",
        "./old-env3",
    }
    
    fmt.Printf("批量删除 %d 个虚拟环境...\n", len(paths))
    
    if err := manager.RemoveMultipleVenvs(paths); err != nil {
        log.Printf("批量删除失败: %v", err)
    } else {
        fmt.Println("✅ 批量删除完成")
    }
}

完整示例:虚拟环境管理器

go
package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
    "path/filepath"
    "strings"
    "time"
    
    "github.com/scagogogo/go-pip-sdk/pkg/pip"
)

func main() {
    manager := pip.NewManager(nil)
    
    for {
        fmt.Println("\n=== 虚拟环境管理器 ===")
        fmt.Println("1. 创建虚拟环境")
        fmt.Println("2. 列出虚拟环境")
        fmt.Println("3. 激活虚拟环境")
        fmt.Println("4. 停用虚拟环境")
        fmt.Println("5. 删除虚拟环境")
        fmt.Println("6. 克隆虚拟环境")
        fmt.Println("7. 清理旧环境")
        fmt.Println("8. 退出")
        fmt.Print("请选择操作 (1-8): ")
        
        reader := bufio.NewReader(os.Stdin)
        choice, _ := reader.ReadString('\n')
        choice = strings.TrimSpace(choice)
        
        switch choice {
        case "1":
            createVenvInteractive(manager, reader)
        case "2":
            listVenvsInteractive(manager)
        case "3":
            activateVenvInteractive(manager, reader)
        case "4":
            deactivateVenvInteractive(manager)
        case "5":
            removeVenvInteractive(manager, reader)
        case "6":
            cloneVenvInteractive(manager, reader)
        case "7":
            cleanupOldVenvsInteractive(manager)
        case "8":
            fmt.Println("再见!")
            return
        default:
            fmt.Println("无效选择,请重试")
        }
    }
}

func createVenvInteractive(manager *pip.Manager, reader *bufio.Reader) {
    fmt.Print("请输入虚拟环境路径: ")
    path, _ := reader.ReadString('\n')
    path = strings.TrimSpace(path)
    
    fmt.Print("请输入 Python 版本 (可选): ")
    version, _ := reader.ReadString('\n')
    version = strings.TrimSpace(version)
    
    fmt.Print("请输入提示符名称 (可选): ")
    prompt, _ := reader.ReadString('\n')
    prompt = strings.TrimSpace(prompt)
    
    if version == "" && prompt == "" {
        // 简单创建
        if err := manager.CreateVenv(path); err != nil {
            fmt.Printf("❌ 创建失败: %v\n", err)
        } else {
            fmt.Println("✅ 虚拟环境创建成功")
        }
    } else {
        // 使用选项创建
        opts := &pip.VenvOptions{
            UpgradePip: true,
        }
        if version != "" {
            opts.PythonVersion = version
        }
        if prompt != "" {
            opts.Prompt = prompt
        }
        
        if err := manager.CreateVenvWithOptions(path, opts); err != nil {
            fmt.Printf("❌ 创建失败: %v\n", err)
        } else {
            fmt.Println("✅ 虚拟环境创建成功")
        }
    }
}

// ... 其他交互函数的实现

下一步

基于 MIT 许可证发布。