示例
本节提供使用 Go Pip SDK 执行各种任务的实际示例。每个示例都包含完整的、可运行的代码和解释。
快速示例
基本包安装
go
package main
import (
"fmt"
"log"
"github.com/scagogogo/go-pip-sdk/pkg/pip"
)
func main() {
manager := pip.NewManager(nil)
pkg := &pip.PackageSpec{
Name: "requests",
Version: ">=2.25.0",
}
if err := manager.InstallPackage(pkg); err != nil {
log.Fatal(err)
}
fmt.Println("包安装成功!")
}
虚拟环境设置
go
package main
import (
"fmt"
"log"
"path/filepath"
"github.com/scagogogo/go-pip-sdk/pkg/pip"
)
func main() {
manager := pip.NewManager(nil)
// 创建虚拟环境
venvPath := filepath.Join(".", "my-venv")
if err := manager.CreateVenv(venvPath); err != nil {
log.Fatal(err)
}
// 激活虚拟环境
if err := manager.ActivateVenv(venvPath); err != nil {
log.Fatal(err)
}
// 在虚拟环境中安装包
packages := []*pip.PackageSpec{
{Name: "requests"},
{Name: "click"},
{Name: "pydantic"},
}
for _, pkg := range packages {
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
package main
import (
"log"
"github.com/scagogogo/go-pip-sdk/pkg/pip"
)
func main() {
manager := pip.NewManager(nil)
opts := &pip.ProjectOptions{
Name: "my-awesome-project",
Version: "0.1.0",
Description: "一个很棒的 Python 项目",
Author: "您的姓名",
AuthorEmail: "your.email@example.com",
License: "MIT",
Dependencies: []string{"requests>=2.25.0", "click>=7.0"},
DevDependencies: []string{"pytest>=6.0", "black>=21.0"},
CreateVenv: true,
VenvPath: "./venv",
}
if err := manager.InitProject("./my-project", opts); err != nil {
log.Fatal(err)
}
fmt.Println("项目初始化成功!")
}
详细示例
基本用法
通过简单的包管理操作学习 SDK 的基础知识。
包管理
高级包安装、版本管理和依赖处理。
虚拟环境
创建和管理 Python 虚拟环境的完整指南。
项目初始化
使用适当的结构和配置引导新的 Python 项目。
高级用法
复杂场景,包括错误处理、日志记录和自定义配置。
常见模式
错误处理模式
go
func handlePipError(err error) {
if err == nil {
return
}
pipErr, ok := err.(*pip.PipErrorDetails)
if !ok {
fmt.Printf("意外错误: %v\n", err)
return
}
fmt.Printf("错误类型: %s\n", pipErr.Type)
fmt.Printf("消息: %s\n", pipErr.Message)
if pipErr.Command != "" {
fmt.Printf("失败的命令: %s\n", pipErr.Command)
}
if pipErr.ExitCode != 0 {
fmt.Printf("退出代码: %d\n", pipErr.ExitCode)
}
if len(pipErr.Suggestions) > 0 {
fmt.Println("建议:")
for _, suggestion := range pipErr.Suggestions {
fmt.Printf(" - %s\n", suggestion)
}
}
if pipErr.Cause != nil {
fmt.Printf("根本原因: %v\n", pipErr.Cause)
}
}
重试模式
go
func installWithRetry(manager *pip.Manager, pkg *pip.PackageSpec, maxRetries int) error {
for i := 0; i < maxRetries; i++ {
err := manager.InstallPackage(pkg)
if err == nil {
return nil // 成功
}
lastErr := err
// 检查错误是否可恢复
if pip.IsErrorType(err, pip.ErrorTypeNetworkError) {
fmt.Printf("网络错误,正在重试... (%d/%d)\n", i+1, maxRetries)
time.Sleep(time.Duration(i+1) * time.Second)
continue
}
return lastErr // 不可恢复的错误
}
return fmt.Errorf("重试 %d 次后失败", maxRetries)
}
日志记录模式
go
func setupLogging() (*pip.Logger, error) {
return pip.NewLogger(&pip.LoggerConfig{
Level: pip.LogLevelInfo,
Output: os.Stdout,
Prefix: "[my-app]",
EnableFile: true,
LogFile: "pip-operations.log",
})
}
func main() {
logger, err := setupLogging()
if err != nil {
log.Fatal(err)
}
defer logger.Close()
manager := pip.NewManager(nil)
manager.SetCustomLogger(logger)
// 现在所有操作都将被记录
// ...
}
测试示例
使用虚拟环境进行单元测试
go
func TestWithCleanEnvironment(t *testing.T) {
manager := pip.NewManager(nil)
// 创建临时虚拟环境
tempDir, err := os.MkdirTemp("", "test-venv-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
venvPath := filepath.Join(tempDir, "venv")
require.NoError(t, manager.CreateVenv(venvPath))
require.NoError(t, manager.ActivateVenv(venvPath))
// 在干净环境中测试包安装
pkg := &pip.PackageSpec{Name: "requests"}
require.NoError(t, manager.InstallPackage(pkg))
// 验证安装
packages, err := manager.ListPackages()
require.NoError(t, err)
found := false
for _, p := range packages {
if p.Name == "requests" {
found = true
break
}
}
require.True(t, found, "应该安装 requests 包")
}
集成测试
go
func TestFullWorkflow(t *testing.T) {
manager := pip.NewManager(nil)
// 检查 pip 安装
installed, err := manager.IsInstalled()
require.NoError(t, err)
if !installed {
require.NoError(t, manager.Install())
}
// 创建项目
tempDir, err := os.MkdirTemp("", "test-project-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
opts := &pip.ProjectOptions{
Name: "test-project",
Version: "0.1.0",
Author: "测试作者",
AuthorEmail: "test@example.com",
Dependencies: []string{"requests"},
CreateVenv: true,
}
require.NoError(t, manager.InitProject(tempDir, opts))
// 验证项目结构
files := []string{
"setup.py",
"pyproject.toml",
"requirements.txt",
"README.md",
".gitignore",
}
for _, file := range files {
path := filepath.Join(tempDir, file)
_, err := os.Stat(path)
require.NoError(t, err, "文件 %s 应该存在", file)
}
}
性能示例
并发包安装
go
func installPackagesConcurrently(packages []*pip.PackageSpec) error {
var wg sync.WaitGroup
errChan := make(chan error, len(packages))
for _, pkg := range packages {
wg.Add(1)
go func(p *pip.PackageSpec) {
defer wg.Done()
manager := pip.NewManager(nil)
if err := manager.InstallPackage(p); err != nil {
errChan <- fmt.Errorf("安装 %s 失败: %w", p.Name, err)
}
}(pkg)
}
wg.Wait()
close(errChan)
var errors []error
for err := range errChan {
errors = append(errors, err)
}
if len(errors) > 0 {
return fmt.Errorf("安装错误: %v", errors)
}
return nil
}