dependency_check.py
5.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
"""
检测系统依赖工具
用于检测 PDF 生成所需的系统依赖
"""
import sys
import platform
from loguru import logger
def _get_platform_specific_instructions():
"""
获取针对当前平台的安装说明
Returns:
str: 平台特定的安装说明
"""
system = platform.system()
if system == "Darwin": # macOS
return (
"║ 🍎 macOS 系统解决方案: ║\n"
"║ ║\n"
"║ 1. 安装系统依赖: ║\n"
"║ brew install pango gdk-pixbuf libffi ║\n"
"║ ║\n"
"║ 2. 设置环境变量(重要!): ║\n"
"║ export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH ║\n"
"║ ║\n"
"║ 3. 永久生效(推荐): ║\n"
"║ echo 'export DYLD_LIBRARY_PATH=/opt/homebrew/lib:$DYLD_LIBRARY_PATH' >> ~/.zshrc ║\n"
"║ source ~/.zshrc ║\n"
)
elif system == "Linux":
return (
"║ 🐧 Linux 系统解决方案: ║\n"
"║ ║\n"
"║ Ubuntu/Debian: ║\n"
"║ sudo apt-get install libpango-1.0-0 libpangoft2-1.0-0 \\ ║\n"
"║ libgdk-pixbuf2.0-0 libffi-dev libcairo2 ║\n"
"║ ║\n"
"║ CentOS/RHEL: ║\n"
"║ sudo yum install pango gdk-pixbuf2 libffi-devel cairo ║\n"
)
elif system == "Windows":
return (
"║ 🪟 Windows 系统解决方案: ║\n"
"║ ║\n"
"║ 下载并安装 GTK3 Runtime: ║\n"
"║ https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases ║\n"
)
else:
return (
"║ 请查看 README.md 了解您系统的安装方法 ║\n"
)
def check_pango_available():
"""
检测 Pango 库是否可用
Returns:
tuple: (is_available: bool, message: str)
"""
try:
# 尝试导入 weasyprint 并初始化 Pango
from weasyprint import HTML
from weasyprint.text.ffi import ffi, pango
# 尝试调用 Pango 函数来确认库可用
pango.pango_version()
return True, "✓ Pango 依赖检测通过,PDF 导出功能可用"
except OSError as e:
# Pango 库未安装或无法加载
error_msg = str(e)
platform_instructions = _get_platform_specific_instructions()
if 'gobject' in error_msg.lower() or 'pango' in error_msg.lower() or 'gdk' in error_msg.lower():
return False, (
"╔════════════════════════════════════════════════════════════════╗\n"
"║ ⚠️ PDF 导出依赖缺失 ║\n"
"║ ║\n"
"║ 📄 PDF 导出功能将不可用(其他功能不受影响) ║\n"
"║ ║\n"
f"{platform_instructions}"
"║ ║\n"
"║ 📖 完整文档:根目录 README.md 第393行「PDF 导出依赖」 ║\n"
"╚════════════════════════════════════════════════════════════════╝"
)
return False, f"⚠ PDF 依赖加载失败: {error_msg}"
except ImportError as e:
# weasyprint 未安装
return False, (
"⚠ WeasyPrint 未安装\n"
"解决方法: pip install weasyprint"
)
except Exception as e:
# 其他未知错误
return False, f"⚠ PDF 依赖检测失败: {e}"
def log_dependency_status():
"""
记录系统依赖状态到日志
"""
is_available, message = check_pango_available()
if is_available:
logger.success(message)
else:
logger.warning(message)
logger.info("💡 提示:PDF 导出功能需要 Pango 库支持,但不影响系统其他功能的正常使用")
logger.info("📚 安装说明请参考:根目录下的 README.md 文件")
return is_available
if __name__ == "__main__":
# 用于独立测试
is_available, message = check_pango_available()
print(message)
sys.exit(0 if is_available else 1)