Exeprotector/check_compile_env.py

232 lines
7.5 KiB
Python
Raw Normal View History

2025-10-23 18:28:10 +08:00
"""
编译环境检查工具
用于诊断 PyInstaller 编译问题
作者太一
"""
import sys
import subprocess
import os
def check_python():
"""检查Python版本"""
print("\n" + "="*60)
print("【1】检查 Python 环境")
print("="*60)
version = sys.version
print(f"✓ Python 版本: {version}")
print(f"✓ Python 路径: {sys.executable}")
if sys.version_info < (3, 7):
print("⚠️ 警告: Python 版本过低,建议使用 Python 3.7+")
return False
return True
def check_pip():
"""检查pip"""
print("\n" + "="*60)
print("【2】检查 pip")
print("="*60)
try:
result = subprocess.run([sys.executable, '-m', 'pip', '--version'],
capture_output=True, text=True, timeout=10)
if result.returncode == 0:
print(f"✓ pip 版本: {result.stdout.strip()}")
return True
else:
print("✗ pip 不可用")
return False
except Exception as e:
print(f"✗ 检查 pip 失败: {e}")
return False
def check_module(module_name):
"""检查模块是否安装"""
try:
__import__(module_name)
return True
except ImportError:
return False
def check_dependencies():
"""检查依赖项"""
print("\n" + "="*60)
print("【3】检查必需的依赖包")
print("="*60)
required = {
'pyinstaller': 'PyInstaller',
'cryptography': 'cryptography',
'requests': 'requests',
'tkinter': 'tkinter',
}
all_ok = True
for module, name in required.items():
if check_module(module):
try:
if module == 'pyinstaller':
import pyinstaller
version = pyinstaller.__version__
elif module == 'cryptography':
import cryptography
version = cryptography.__version__
elif module == 'requests':
import requests
version = requests.__version__
elif module == 'tkinter':
import tkinter
version = tkinter.TkVersion
else:
version = "已安装"
print(f"{name:20s} - 版本 {version}")
except:
print(f"{name:20s} - 已安装")
else:
print(f"{name:20s} - 未安装")
all_ok = False
return all_ok
def check_pyinstaller():
"""检查PyInstaller"""
print("\n" + "="*60)
print("【4】检查 PyInstaller")
print("="*60)
try:
result = subprocess.run(['pyinstaller', '--version'],
capture_output=True, text=True, timeout=10)
if result.returncode == 0:
version = result.stdout.strip()
print(f"✓ PyInstaller 版本: {version}")
# 测试简单编译
print("\n测试简单的编译...")
test_py = "_test_compile.py"
test_exe = "_test_compile.exe"
# 创建测试文件
with open(test_py, 'w', encoding='utf-8') as f:
f.write('print("Hello, PyInstaller!")\ninput("按回车键退出...")')
cmd = [
'pyinstaller', '--onefile', '--clean', '--noconfirm',
'--distpath', '.', '--workpath', '.build_test',
'--specpath', '.build_test', '--noupx',
test_py
]
print(f"执行命令: {' '.join(cmd)}")
result = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
if result.returncode == 0 and os.path.exists(test_exe):
print(f"✓ 编译测试成功!生成文件: {test_exe}")
print(f" 文件大小: {os.path.getsize(test_exe) / 1024 / 1024:.2f} MB")
# 清理测试文件
try:
os.remove(test_py)
os.remove(test_exe)
import shutil
if os.path.exists('.build_test'):
shutil.rmtree('.build_test')
if os.path.exists('_test_compile.spec'):
os.remove('_test_compile.spec')
print(" 测试文件已清理")
except:
pass
return True
else:
print("✗ 编译测试失败")
if result.stderr:
print("\n错误信息:")
print(result.stderr[-1000:])
return False
else:
print("✗ PyInstaller 不可用")
print("请运行: pip install pyinstaller")
return False
except FileNotFoundError:
print("✗ PyInstaller 未安装或不在系统路径中")
print("请运行: pip install pyinstaller")
return False
except Exception as e:
print(f"✗ 检查 PyInstaller 失败: {e}")
return False
def check_disk_space():
"""检查磁盘空间"""
print("\n" + "="*60)
print("【5】检查磁盘空间")
print("="*60)
try:
import shutil
total, used, free = shutil.disk_usage(os.getcwd())
print(f"当前目录: {os.getcwd()}")
print(f"总空间: {total / (1024**3):.2f} GB")
print(f"已使用: {used / (1024**3):.2f} GB")
print(f"可用: {free / (1024**3):.2f} GB")
if free < 1 * 1024**3: # 小于1GB
print("⚠️ 警告: 可用空间不足 1GB编译可能失败")
return False
else:
print("✓ 磁盘空间充足")
return True
except Exception as e:
print(f"⚠️ 无法检查磁盘空间: {e}")
return True
def main():
"""主函数"""
print("\n" + ""*60)
print("" + " "*58 + "")
print("" + " 编译环境诊断工具 - EXE Encryption Tool ".center(58) + "")
print("" + " "*58 + "")
print(""*60)
results = []
results.append(("Python", check_python()))
results.append(("pip", check_pip()))
results.append(("依赖包", check_dependencies()))
results.append(("PyInstaller", check_pyinstaller()))
results.append(("磁盘空间", check_disk_space()))
print("\n" + "="*60)
print("【检查结果汇总】")
print("="*60)
all_passed = True
for name, passed in results:
status = "✓ 通过" if passed else "✗ 失败"
print(f"{name:20s} {status}")
if not passed:
all_passed = False
print("="*60)
if all_passed:
print("\n🎉 所有检查通过!编译环境正常。")
print("\n如果仍然遇到编译问题,请检查:")
print(" 1. 杀毒软件是否拦截")
print(" 2. 防火墙设置")
print(" 3. 用户权限(建议以管理员身份运行)")
print(" 4. 临时文件夹权限")
else:
print("\n❌ 部分检查失败,请根据上述提示修复问题。")
print("\n常见解决方案:")
print(" 1. 安装缺失的包: pip install -r requirements.txt")
print(" 2. 升级 PyInstaller: pip install --upgrade pyinstaller")
print(" 3. 清理 pip 缓存: pip cache purge")
print(" 4. 重新安装依赖: pip uninstall pyinstaller && pip install pyinstaller")
print("\n")
input("按回车键退出...")
if __name__ == '__main__':
main()