Skip to content

基本用法示例

本示例展示了 Python Requirements Parser 的基本使用方法。

完整示例代码

go
package main

import (
	"fmt"
	"log"

	"github.com/scagogogo/python-requirements-parser/pkg/parser"
)

func main() {
	fmt.Println("=== Python Requirements Parser 基本用法示例 ===")
	fmt.Println()

	// 创建解析器
	p := parser.New()

	// 示例 requirements.txt 内容
	content := `# 生产依赖
flask==2.0.1  # Web 框架
django>=3.2.0,<4.0.0  # 另一个 Web 框架
requests>=2.25.0  # HTTP 库

# 开发依赖
pytest>=6.0.0  # 测试框架
black==21.9b0  # 代码格式化工具

# 带 extras 的依赖
uvicorn[standard]>=0.15.0  # ASGI 服务器

# 环境标记
pywin32>=1.0; platform_system == "Windows"  # Windows 特定依赖

# 空行和注释会被保留

# VCS 依赖
git+https://github.com/user/project.git#egg=project

# URL 依赖
https://example.com/package.whl

# 本地路径
./local-package`

	fmt.Println("要解析的 requirements.txt 内容:")
	fmt.Println(content)
	fmt.Println()

	// 解析内容
	requirements, err := p.ParseString(content)
	if err != nil {
		log.Fatalf("解析失败: %v", err)
	}

	fmt.Printf("解析成功!共找到 %d 行内容\n", len(requirements))
	fmt.Println()

	// 分类显示结果
	fmt.Println("=== 解析结果分类 ===")

	var packages, comments, empty, special int

	for i, req := range requirements {
		fmt.Printf("[%d] ", i+1)

		switch {
		case req.IsComment:
			fmt.Printf("注释: %s\n", req.Comment)
			comments++
		case req.IsEmpty:
			fmt.Println("空行")
			empty++
		case req.IsVCS:
			fmt.Printf("VCS 依赖: %s (类型: %s, URL: %s)\n", req.Name, req.VCSType, req.URL)
			special++
		case req.IsURL:
			fmt.Printf("URL 依赖: %s\n", req.URL)
			special++
		case req.IsLocalPath:
			fmt.Printf("本地路径: %s\n", req.LocalPath)
			special++
		default:
			fmt.Printf("包依赖: %s", req.Name)
			if req.Version != "" {
				fmt.Printf(" %s", req.Version)
			}
			if len(req.Extras) > 0 {
				fmt.Printf(" [%s]", req.Extras)
			}
			if req.Markers != "" {
				fmt.Printf(" ; %s", req.Markers)
			}
			if req.Comment != "" {
				fmt.Printf(" # %s", req.Comment)
			}
			fmt.Println()
			packages++
		}
	}

	fmt.Println()
	fmt.Printf("统计信息:\n")
	fmt.Printf("- 包依赖: %d\n", packages)
	fmt.Printf("- 特殊依赖: %d\n", special)
	fmt.Printf("- 注释行: %d\n", comments)
	fmt.Printf("- 空行: %d\n", empty)
	fmt.Printf("- 总计: %d\n", len(requirements))

	fmt.Println()
	fmt.Println("=== 详细包信息 ===")

	for _, req := range requirements {
		if !req.IsComment && !req.IsEmpty && req.Name != "" {
			fmt.Printf("包名: %s\n", req.Name)
			if req.Version != "" {
				fmt.Printf("  版本: %s\n", req.Version)
			}
			if len(req.Extras) > 0 {
				fmt.Printf("  Extras: %v\n", req.Extras)
			}
			if req.Markers != "" {
				fmt.Printf("  环境标记: %s\n", req.Markers)
			}
			if req.Comment != "" {
				fmt.Printf("  注释: %s\n", req.Comment)
			}
			if req.IsVCS {
				fmt.Printf("  VCS 类型: %s\n", req.VCSType)
				fmt.Printf("  URL: %s\n", req.URL)
			}
			if req.IsURL {
				fmt.Printf("  URL: %s\n", req.URL)
			}
			if req.IsLocalPath {
				fmt.Printf("  本地路径: %s\n", req.LocalPath)
			}
			fmt.Printf("  原始行: %s\n", req.OriginalLine)
			fmt.Println()
		}
	}
}

运行结果

当你运行这个示例时,会看到类似以下的输出:

=== Python Requirements Parser 基本用法示例 ===

要解析的 requirements.txt 内容:
# 生产依赖
flask==2.0.1  # Web 框架
django>=3.2.0,<4.0.0  # 另一个 Web 框架
...

解析成功!共找到 19 行内容

=== 解析结果分类 ===
[1] 注释: 生产依赖
[2] 包依赖: flask ==2.0.1 # Web 框架
[3] 包依赖: django >=3.2.0,<4.0.0 # 另一个 Web 框架
...

统计信息:
- 包依赖: 6 个
- 特殊依赖: 3 个
- 注释行: 5 个
- 空行: 2 个
- 总计: 19 行

关键特性演示

1. 多种依赖格式支持

这个示例展示了解析器支持的各种格式:

  • 基本包依赖: flask==2.0.1
  • 版本范围: django>=3.2.0,<4.0.0
  • Extras: uvicorn[standard]>=0.15.0
  • 环境标记: pywin32>=1.0; platform_system == "Windows"
  • VCS 依赖: git+https://github.com/user/project.git#egg=project
  • URL 依赖: https://example.com/package.whl
  • 本地路径: ./local-package

2. 注释和格式保留

解析器完美保留:

  • 行注释和行尾注释
  • 空行
  • 原始行内容

3. 结构化数据

每个依赖项被解析为结构化的 Requirement 对象,包含:

  • 包名、版本、extras
  • 环境标记和注释
  • 类型标识(VCS、URL、本地路径等)
  • 原始行内容

错误处理

go
requirements, err := p.ParseString(content)
if err != nil {
    log.Fatalf("解析失败: %v", err)
}

解析器会返回详细的错误信息,帮助你定位问题。

下一步

相关链接

Released under the MIT License