Exeprotector/check_compile_env.py
2025-10-23 18:28:10 +08:00

232 lines
7.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
编译环境检查工具
用于诊断 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()