Spaces:
Runtime error
Runtime error
#!/usr/bin/env python3 | |
""" | |
Build script for creating SafetyMaster Pro standalone executable | |
Uses PyInstaller to create a distributable executable | |
""" | |
import os | |
import sys | |
import shutil | |
import subprocess | |
from pathlib import Path | |
def install_pyinstaller(): | |
"""Install PyInstaller if not already installed.""" | |
try: | |
import PyInstaller | |
print("β PyInstaller already installed") | |
except ImportError: | |
print("π¦ Installing PyInstaller...") | |
subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"]) | |
print("β PyInstaller installed successfully") | |
def create_spec_file(): | |
"""Create PyInstaller spec file for SafetyMaster Pro.""" | |
spec_content = ''' | |
# -*- mode: python ; coding: utf-8 -*- | |
block_cipher = None | |
a = Analysis( | |
['web_interface.py'], | |
pathex=[], | |
binaries=[], | |
datas=[ | |
('templates', 'templates'), | |
('*.pt', '.'), | |
('*.html', '.'), | |
('README.md', '.'), | |
('requirements.txt', '.'), | |
], | |
hiddenimports=[ | |
'engineio.async_drivers.threading', | |
'socketio', | |
'flask_socketio', | |
'ultralytics', | |
'torch', | |
'torchvision', | |
'cv2', | |
'numpy', | |
'PIL', | |
'requests', | |
], | |
hookspath=[], | |
hooksconfig={}, | |
runtime_hooks=[], | |
excludes=[], | |
win_no_prefer_redirects=False, | |
win_private_assemblies=False, | |
cipher=block_cipher, | |
noarchive=False, | |
) | |
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) | |
exe = EXE( | |
pyz, | |
a.scripts, | |
a.binaries, | |
a.zipfiles, | |
a.datas, | |
[], | |
name='SafetyMasterPro', | |
debug=False, | |
bootloader_ignore_signals=False, | |
strip=False, | |
upx=True, | |
upx_exclude=[], | |
runtime_tmpdir=None, | |
console=True, | |
disable_windowed_traceback=False, | |
argv_emulation=False, | |
target_arch=None, | |
codesign_identity=None, | |
entitlements_file=None, | |
icon='icon.ico' if os.path.exists('icon.ico') else None, | |
) | |
''' | |
with open('SafetyMasterPro.spec', 'w') as f: | |
f.write(spec_content.strip()) | |
print("β Created PyInstaller spec file") | |
def build_executable(): | |
"""Build the standalone executable.""" | |
print("π¨ Building SafetyMaster Pro executable...") | |
# Clean previous builds | |
if os.path.exists('dist'): | |
shutil.rmtree('dist') | |
if os.path.exists('build'): | |
shutil.rmtree('build') | |
# Build executable | |
cmd = [ | |
'pyinstaller', | |
'--clean', | |
'--noconfirm', | |
'SafetyMasterPro.spec' | |
] | |
try: | |
subprocess.check_call(cmd) | |
print("β Executable built successfully!") | |
print(f"π Executable location: {os.path.abspath('dist/SafetyMasterPro')}") | |
# Create distribution folder | |
dist_folder = "SafetyMasterPro_Distribution" | |
if os.path.exists(dist_folder): | |
shutil.rmtree(dist_folder) | |
os.makedirs(dist_folder) | |
# Copy executable | |
if os.path.exists('dist/SafetyMasterPro'): | |
if sys.platform == "win32": | |
shutil.copy2('dist/SafetyMasterPro.exe', dist_folder) | |
else: | |
shutil.copy2('dist/SafetyMasterPro', dist_folder) | |
# Copy additional files | |
files_to_copy = [ | |
'README.md', | |
'requirements.txt', | |
] | |
for file in files_to_copy: | |
if os.path.exists(file): | |
shutil.copy2(file, dist_folder) | |
# Copy model files | |
for model_file in Path('.').glob('*.pt'): | |
shutil.copy2(model_file, dist_folder) | |
# Copy templates if they exist | |
if os.path.exists('templates'): | |
shutil.copytree('templates', os.path.join(dist_folder, 'templates')) | |
print(f"π¦ Distribution package created: {dist_folder}/") | |
except subprocess.CalledProcessError as e: | |
print(f"β Build failed: {e}") | |
return False | |
return True | |
def create_installer_script(): | |
"""Create installation script for users.""" | |
# Windows batch script | |
windows_script = '''@echo off | |
echo SafetyMaster Pro - Installation Script | |
echo ===================================== | |
echo. | |
echo Checking Python installation... | |
python --version >nul 2>&1 | |
if errorlevel 1 ( | |
echo ERROR: Python is not installed or not in PATH | |
echo Please install Python 3.8+ from https://python.org | |
pause | |
exit /b 1 | |
) | |
echo Installing SafetyMaster Pro dependencies... | |
pip install -r requirements.txt | |
echo. | |
echo Installation complete! | |
echo. | |
echo To run SafetyMaster Pro: | |
echo python web_interface.py | |
echo. | |
echo Or use the executable: | |
echo SafetyMasterPro.exe | |
echo. | |
pause | |
''' | |
# Unix shell script | |
unix_script = '''#!/bin/bash | |
echo "SafetyMaster Pro - Installation Script" | |
echo "=====================================" | |
echo | |
echo "Checking Python installation..." | |
if ! command -v python3 &> /dev/null; then | |
echo "ERROR: Python 3 is not installed" | |
echo "Please install Python 3.8+ from your package manager" | |
exit 1 | |
fi | |
echo "Installing SafetyMaster Pro dependencies..." | |
pip3 install -r requirements.txt | |
echo | |
echo "Installation complete!" | |
echo | |
echo "To run SafetyMaster Pro:" | |
echo " python3 web_interface.py" | |
echo | |
echo "Or use the executable:" | |
echo " ./SafetyMasterPro" | |
echo | |
''' | |
# Write scripts | |
with open('SafetyMasterPro_Distribution/install.bat', 'w') as f: | |
f.write(windows_script) | |
with open('SafetyMasterPro_Distribution/install.sh', 'w') as f: | |
f.write(unix_script) | |
# Make shell script executable | |
if sys.platform != "win32": | |
os.chmod('SafetyMasterPro_Distribution/install.sh', 0o755) | |
print("β Installation scripts created") | |
def main(): | |
"""Main build process.""" | |
print("π SafetyMaster Pro - Build Script") | |
print("=" * 40) | |
# Install PyInstaller | |
install_pyinstaller() | |
# Create spec file | |
create_spec_file() | |
# Build executable | |
if build_executable(): | |
create_installer_script() | |
print("\nπ Build completed successfully!") | |
print("\nπ¦ Distribution package contents:") | |
print(" - SafetyMasterPro executable") | |
print(" - Model files (*.pt)") | |
print(" - Templates folder") | |
print(" - README.md") | |
print(" - requirements.txt") | |
print(" - install.bat (Windows)") | |
print(" - install.sh (Unix/Linux/Mac)") | |
print(f"\nπ Package location: {os.path.abspath('SafetyMasterPro_Distribution')}") | |
print("\nβ Ready for distribution!") | |
else: | |
print("\nβ Build failed!") | |
sys.exit(1) | |
if __name__ == "__main__": | |
main() |