pyinstaller revert
This commit is contained in:
@@ -1,119 +0,0 @@
|
|||||||
# Building Orisys Sensor Demo Executable and Installer
|
|
||||||
|
|
||||||
This guide explains how to package `camera_gui.py` into a standalone executable (.exe) and create an installer.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
1. **Python 3.8+** installed
|
|
||||||
2. **All dependencies** installed:
|
|
||||||
```bash
|
|
||||||
pip install -r requirements.txt
|
|
||||||
pip install PyQt5 pyqtgraph PyInstaller
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **For creating installer (.exe installer)**:
|
|
||||||
- Download and install [Inno Setup](https://jrsoftware.org/isdl.php) (free, open-source)
|
|
||||||
|
|
||||||
## Method 1: Using PyInstaller (Simple)
|
|
||||||
|
|
||||||
### Option A: Using the spec file (Recommended)
|
|
||||||
|
|
||||||
1. Build the executable:
|
|
||||||
```bash
|
|
||||||
pyinstaller camera_gui.spec
|
|
||||||
```
|
|
||||||
|
|
||||||
2. The executable will be in the `dist` folder: `dist\camera_gui.exe`
|
|
||||||
|
|
||||||
### Option B: Using the build script
|
|
||||||
|
|
||||||
1. Run the build script:
|
|
||||||
```bash
|
|
||||||
python build_exe.py
|
|
||||||
```
|
|
||||||
|
|
||||||
2. The executable will be in the `dist` folder: `dist\camera_gui.exe`
|
|
||||||
|
|
||||||
### Option C: Manual PyInstaller command
|
|
||||||
|
|
||||||
```bash
|
|
||||||
pyinstaller --name=camera_gui --onefile --windowed --icon=orisys_logo_notext.png --add-data="orisys_logo_notext.png;." camera_gui.py
|
|
||||||
```
|
|
||||||
|
|
||||||
## Method 2: Creating an Installer (.exe installer)
|
|
||||||
|
|
||||||
### Using Inno Setup
|
|
||||||
|
|
||||||
1. **Build the executable first** using Method 1 above
|
|
||||||
|
|
||||||
2. **Open Inno Setup Compiler**
|
|
||||||
|
|
||||||
3. **Open the script file**: `build_installer.iss`
|
|
||||||
|
|
||||||
4. **Compile the installer**:
|
|
||||||
- Click "Build" → "Compile"
|
|
||||||
- Or press F9
|
|
||||||
|
|
||||||
5. **The installer will be created** in the `installer` folder: `installer\OrisysSensorDemo_Setup.exe`
|
|
||||||
|
|
||||||
### Customizing the Installer
|
|
||||||
|
|
||||||
Edit `build_installer.iss` to customize:
|
|
||||||
- App name and version
|
|
||||||
- Installation directory
|
|
||||||
- Start menu shortcuts
|
|
||||||
- Desktop icons
|
|
||||||
- License file
|
|
||||||
- Additional files to include
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Common Issues
|
|
||||||
|
|
||||||
1. **"Module not found" errors**:
|
|
||||||
- Add missing modules to `hiddenimports` in `camera_gui.spec`
|
|
||||||
- Or use `--hidden-import=module_name` in PyInstaller command
|
|
||||||
|
|
||||||
2. **Large executable size**:
|
|
||||||
- This is normal - PyInstaller bundles Python interpreter and all dependencies
|
|
||||||
- Consider using `--onedir` instead of `--onefile` for faster startup
|
|
||||||
|
|
||||||
3. **Missing DLL files**:
|
|
||||||
- Ensure Visual C++ Redistributable is installed on target machines
|
|
||||||
- Include required DLLs using `--add-binary` option
|
|
||||||
|
|
||||||
4. **OpenCV/CUDA issues**:
|
|
||||||
- If using CUDA, ensure CUDA DLLs are available
|
|
||||||
- May need to add CUDA paths to `pathex` in spec file
|
|
||||||
|
|
||||||
### Testing the Executable
|
|
||||||
|
|
||||||
1. Test on a clean Windows machine (without Python installed)
|
|
||||||
2. Ensure all required DLLs are included
|
|
||||||
3. Test camera functionality
|
|
||||||
4. Test file saving functionality
|
|
||||||
|
|
||||||
## File Structure
|
|
||||||
|
|
||||||
After building, you should have:
|
|
||||||
|
|
||||||
```
|
|
||||||
dist/
|
|
||||||
└── camera_gui.exe # Standalone executable
|
|
||||||
|
|
||||||
installer/
|
|
||||||
└── OrisysSensorDemo_Setup.exe # Installer (after compiling with Inno Setup)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Distribution
|
|
||||||
|
|
||||||
- **Standalone executable**: Just distribute `dist\camera_gui.exe`
|
|
||||||
- **Installer**: Distribute `installer\OrisysSensorDemo_Setup.exe` for easier installation
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
|
|
||||||
- The executable is large (~100-200MB) because it includes Python interpreter and all dependencies
|
|
||||||
- First launch may be slower as files are extracted
|
|
||||||
- Antivirus software may flag PyInstaller executables - this is a false positive
|
|
||||||
- Consider code signing for production releases
|
|
||||||
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
@echo off
|
|
||||||
REM Build script for Windows
|
|
||||||
REM Creates executable and optionally installer
|
|
||||||
|
|
||||||
echo ========================================
|
|
||||||
echo Building Orisys Sensor Demo
|
|
||||||
echo ========================================
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM Check if Python is available
|
|
||||||
python --version >nul 2>&1
|
|
||||||
if errorlevel 1 (
|
|
||||||
echo ERROR: Python is not installed or not in PATH
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM Install/upgrade PyInstaller if needed
|
|
||||||
echo Installing/upgrading PyInstaller...
|
|
||||||
pip install --upgrade PyInstaller
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo Building executable...
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM Build using spec file
|
|
||||||
pyinstaller camera_gui.spec
|
|
||||||
|
|
||||||
if errorlevel 1 (
|
|
||||||
echo.
|
|
||||||
echo ERROR: Build failed!
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo ========================================
|
|
||||||
echo Build successful!
|
|
||||||
echo Executable: dist\camera_gui.exe
|
|
||||||
echo ========================================
|
|
||||||
echo.
|
|
||||||
|
|
||||||
REM Ask if user wants to create installer
|
|
||||||
set /p CREATE_INSTALLER="Create installer? (y/n): "
|
|
||||||
if /i "%CREATE_INSTALLER%"=="y" (
|
|
||||||
echo.
|
|
||||||
echo Creating installer...
|
|
||||||
echo Please ensure Inno Setup Compiler is installed.
|
|
||||||
echo Opening Inno Setup script...
|
|
||||||
|
|
||||||
REM Try to find Inno Setup Compiler
|
|
||||||
if exist "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" (
|
|
||||||
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" build_installer.iss
|
|
||||||
) else if exist "C:\Program Files\Inno Setup 6\ISCC.exe" (
|
|
||||||
"C:\Program Files\Inno Setup 6\ISCC.exe" build_installer.iss
|
|
||||||
) else (
|
|
||||||
echo Inno Setup Compiler not found in default locations.
|
|
||||||
echo Please compile build_installer.iss manually using Inno Setup Compiler.
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo Done!
|
|
||||||
pause
|
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
"""
|
|
||||||
Build script for creating camera_gui.exe using PyInstaller
|
|
||||||
"""
|
|
||||||
import PyInstaller.__main__
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Add PyQt5 and pyqtgraph to requirements if not present
|
|
||||||
requirements = [
|
|
||||||
'PyInstaller>=5.0',
|
|
||||||
'PyQt5>=5.15.0',
|
|
||||||
'pyqtgraph>=0.12.0',
|
|
||||||
]
|
|
||||||
|
|
||||||
def build_exe():
|
|
||||||
"""Build the executable"""
|
|
||||||
|
|
||||||
# PyInstaller arguments
|
|
||||||
args = [
|
|
||||||
'camera_gui.py',
|
|
||||||
'--name=camera_gui',
|
|
||||||
'--onefile', # Create a single executable file
|
|
||||||
'--windowed', # No console window (GUI app)
|
|
||||||
'--icon=orisys_logo_notext.png', # Use logo as icon
|
|
||||||
'--add-data=orisys_logo_notext.png;.', # Include logo file
|
|
||||||
'--hidden-import=PyQt5.QtCore',
|
|
||||||
'--hidden-import=PyQt5.QtGui',
|
|
||||||
'--hidden-import=PyQt5.QtWidgets',
|
|
||||||
'--hidden-import=pyqtgraph',
|
|
||||||
'--hidden-import=orisys',
|
|
||||||
'--hidden-import=cv2',
|
|
||||||
'--hidden-import=numpy',
|
|
||||||
'--collect-all=pyqtgraph', # Collect all pyqtgraph data
|
|
||||||
'--collect-all=PyQt5', # Collect all PyQt5 data
|
|
||||||
'--collect-all=cv2', # Collect all OpenCV data
|
|
||||||
]
|
|
||||||
|
|
||||||
# Add orisys package if it's a local package
|
|
||||||
if os.path.exists('src/orisys'):
|
|
||||||
args.append('--paths=src')
|
|
||||||
|
|
||||||
print("Building executable...")
|
|
||||||
print("Command: PyInstaller " + " ".join(args))
|
|
||||||
|
|
||||||
PyInstaller.__main__.run(args)
|
|
||||||
|
|
||||||
print("\nBuild complete! Executable is in the 'dist' folder.")
|
|
||||||
print("You can now create an installer using Inno Setup or NSIS.")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
build_exe()
|
|
||||||
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
; Inno Setup Script for camera_gui installer
|
|
||||||
; Compile this script using Inno Setup Compiler
|
|
||||||
; Download from: https://jrsoftware.org/isdl.php
|
|
||||||
|
|
||||||
[Setup]
|
|
||||||
AppName=Orisys Sensor Demo
|
|
||||||
AppVersion=1.0.0
|
|
||||||
AppPublisher=Orisys
|
|
||||||
AppPublisherURL=https://orisys.com
|
|
||||||
DefaultDirName={autopf}\Orisys\SensorDemo
|
|
||||||
DefaultGroupName=Orisys Sensor Demo
|
|
||||||
AllowNoIcons=yes
|
|
||||||
LicenseFile=
|
|
||||||
OutputDir=installer
|
|
||||||
OutputBaseFilename=OrisysSensorDemo_Setup
|
|
||||||
Compression=lzma
|
|
||||||
SolidCompression=yes
|
|
||||||
WizardStyle=modern
|
|
||||||
PrivilegesRequired=admin
|
|
||||||
ArchitecturesInstallIn64BitMode=x64
|
|
||||||
|
|
||||||
[Languages]
|
|
||||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
||||||
Name: "chinese"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
|
|
||||||
|
|
||||||
[Tasks]
|
|
||||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
|
||||||
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode
|
|
||||||
|
|
||||||
[Files]
|
|
||||||
Source: "dist\camera_gui.exe"; DestDir: "{app}"; Flags: ignoreversion
|
|
||||||
Source: "orisys_logo_notext.png"; DestDir: "{app}"; Flags: ignoreversion
|
|
||||||
; Add any other required files here
|
|
||||||
; Source: "config\*"; DestDir: "{app}\config"; Flags: ignoreversion recursesubdirs createallsubdirs
|
|
||||||
|
|
||||||
[Icons]
|
|
||||||
Name: "{group}\Orisys Sensor Demo"; Filename: "{app}\camera_gui.exe"; IconFilename: "{app}\orisys_logo_notext.png"
|
|
||||||
Name: "{group}\{cm:UninstallProgram,Orisys Sensor Demo}"; Filename: "{uninstallexe}"
|
|
||||||
Name: "{autodesktop}\Orisys Sensor Demo"; Filename: "{app}\camera_gui.exe"; IconFilename: "{app}\orisys_logo_notext.png"; Tasks: desktopicon
|
|
||||||
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Orisys Sensor Demo"; Filename: "{app}\camera_gui.exe"; IconFilename: "{app}\orisys_logo_notext.png"; Tasks: quicklaunchicon
|
|
||||||
|
|
||||||
[Run]
|
|
||||||
Filename: "{app}\camera_gui.exe"; Description: "{cm:LaunchProgram,Orisys Sensor Demo}"; Flags: nowait postinstall skipifsilent
|
|
||||||
|
|
||||||
[Code]
|
|
||||||
function InitializeSetup(): Boolean;
|
|
||||||
begin
|
|
||||||
Result := True;
|
|
||||||
// Check if Visual C++ Redistributable is installed (if needed)
|
|
||||||
// Add checks here if required
|
|
||||||
end;
|
|
||||||
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
|
||||||
"""
|
|
||||||
PyInstaller spec file for camera_gui
|
|
||||||
Run: pyinstaller camera_gui.spec
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
from PyInstaller.utils.hooks import collect_data_files, collect_submodules
|
|
||||||
|
|
||||||
block_cipher = None
|
|
||||||
|
|
||||||
# Collect data files
|
|
||||||
pyqtgraph_datas = collect_data_files('pyqtgraph')
|
|
||||||
pyqt5_datas = collect_data_files('PyQt5')
|
|
||||||
cv2_datas = collect_data_files('cv2')
|
|
||||||
|
|
||||||
# Collect hidden imports
|
|
||||||
hiddenimports = [
|
|
||||||
'PyQt5.QtCore',
|
|
||||||
'PyQt5.QtGui',
|
|
||||||
'PyQt5.QtWidgets',
|
|
||||||
'pyqtgraph',
|
|
||||||
'pyqtgraph.graphicsItems',
|
|
||||||
'pyqtgraph.widgets',
|
|
||||||
'orisys',
|
|
||||||
'cv2',
|
|
||||||
'numpy',
|
|
||||||
'scipy',
|
|
||||||
]
|
|
||||||
|
|
||||||
# Add orisys submodules if available
|
|
||||||
try:
|
|
||||||
orisys_submodules = collect_submodules('orisys')
|
|
||||||
hiddenimports.extend(orisys_submodules)
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
a = Analysis(
|
|
||||||
['camera_gui.py'],
|
|
||||||
pathex=[],
|
|
||||||
binaries=[],
|
|
||||||
datas=[
|
|
||||||
('orisys_logo_notext.png', '.'),
|
|
||||||
*pyqtgraph_datas,
|
|
||||||
*pyqt5_datas,
|
|
||||||
*cv2_datas,
|
|
||||||
],
|
|
||||||
hiddenimports=hiddenimports,
|
|
||||||
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='camera_gui',
|
|
||||||
debug=False,
|
|
||||||
bootloader_ignore_signals=False,
|
|
||||||
strip=False,
|
|
||||||
upx=True,
|
|
||||||
upx_exclude=[],
|
|
||||||
runtime_tmpdir=None,
|
|
||||||
console=False, # No console window
|
|
||||||
disable_windowed_traceback=False,
|
|
||||||
argv_emulation=False,
|
|
||||||
target_arch=None,
|
|
||||||
codesign_identity=None,
|
|
||||||
entitlements_file=None,
|
|
||||||
icon='orisys_logo_notext.png',
|
|
||||||
)
|
|
||||||
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.1 MiB After Width: | Height: | Size: 2.1 MiB |
Reference in New Issue
Block a user