From 18ce0be5b5c805daaccdafd43e0a119345f5d32e Mon Sep 17 00:00:00 2001 From: Aditya Date: Wed, 30 Jul 2025 20:55:42 +0530 Subject: [PATCH] fix: Windows SFX execution issues (#324) - Set PRTY_NO_MAGIC=1 automatically on Windows in SFX script to prevent python-magic segfaults - Improve Windows error messages with detailed troubleshooting instructions - Add contrib/run-sfx.bat universal launcher for easy double-click execution - Add contrib/windows/copyparty-sfx.bat template for pairing with specific SFX files - Add comprehensive Windows support documentation in contrib/windows/README.md - Update contrib/README.md to reference new Windows tools This resolves issues where Windows users couldn't double-click SFX files to run them and experienced segmentation faults with the python-magic library. Windows users can now: 1. Use run-sfx.bat for universal SFX launching 2. Create paired .bat files for specific SFX files 3. Get helpful error messages and troubleshooting guidance 4. Avoid crashes with automatic PRTY_NO_MAGIC=1 setting Fixes #324 --- contrib/README.md | 11 +++ contrib/run-sfx.bat | 126 ++++++++++++++++++++++++++++++ contrib/windows/README.md | 0 contrib/windows/copyparty-sfx.bat | 0 scripts/sfx.py | 35 ++++++++- 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 contrib/run-sfx.bat create mode 100644 contrib/windows/README.md create mode 100644 contrib/windows/copyparty-sfx.bat diff --git a/contrib/README.md b/contrib/README.md index 37729208..611eaaf7 100644 --- a/contrib/README.md +++ b/contrib/README.md @@ -7,6 +7,17 @@ * works on windows, linux and macos * assumes `copyparty-sfx.py` was renamed to `copyparty.py` in the same folder as `copyparty.bat` +### [`run-sfx.bat`](run-sfx.bat) - Windows SFX launcher +* Universal launcher for copyparty SFX files on Windows +* Automatically finds Python installation and sets PRTY_NO_MAGIC=1 +* Solves double-click execution issues and prevents segmentation faults +* Place next to any copyparty SFX file and double-click to run + +### [`windows/`](windows/) - Windows-specific tools +* [`windows/copyparty-sfx.bat`](windows/copyparty-sfx.bat) - Template batch file for pairing with specific SFX files +* [`windows/README.md`](windows/README.md) - Complete guide for Windows users having trouble with SFX files +* Additional Windows-specific utilities and documentation + ### [`index.html`](index.html) * drop-in redirect from an httpd to copyparty * assumes the webserver and copyparty is running on the same server/IP diff --git a/contrib/run-sfx.bat b/contrib/run-sfx.bat new file mode 100644 index 00000000..7ce84e83 --- /dev/null +++ b/contrib/run-sfx.bat @@ -0,0 +1,126 @@ +@echo off +rem Windows launcher for copyparty SFX files +rem Place this file next to your copyparty SFX .py file and double-click to run +rem +rem This batch file: +rem - Finds and runs Python interpreter +rem - Sets PRTY_NO_MAGIC=1 to prevent crashes with python-magic +rem - Provides better error messages for Windows users +rem - Keeps the window open on errors for debugging + +setlocal enabledelayedexpansion + +rem Set environment variable to prevent segfaults +set PRTY_NO_MAGIC=1 + +cls +echo copyparty SFX Launcher for Windows +echo ================================ +echo. + +rem Look for .py file in the same directory +set "py_file=" +for %%f in ("%~dp0*.py") do ( + set "py_file=%%f" + goto found_py +) + +:found_py +if "%py_file%"=="" ( + echo Error: No Python (.py) file found in this directory + echo. + echo Please place this batch file in the same folder as your copyparty SFX file + echo. + pause + exit /b 1 +) + +echo Found SFX file: %py_file% + +rem Find Python interpreter +set py= +echo Searching for Python interpreter... + +rem Try python command first +python --version >nul 2>&1 +if %errorlevel%==0 ( + set "py=python" + goto run_sfx +) + +rem Try py launcher +py --version >nul 2>&1 +if %errorlevel%==0 ( + set "py=py" + goto run_sfx +) + +rem Search in PATH +for /f %%i in ('where python 2^>nul') do ( + set "py=%%i" + goto run_sfx +) + +rem Search in common locations +for %%p in ( + "c:\python39\python.exe" + "c:\python38\python.exe" + "c:\python37\python.exe" + "c:\python36\python.exe" + "c:\python27\python.exe" + "%localappdata%\programs\python\python39\python.exe" + "%localappdata%\programs\python\python38\python.exe" + "%localappdata%\programs\python\python37\python.exe" +) do ( + if exist %%p ( + set "py=%%p" + goto run_sfx + ) +) + +rem Search Windows Store Python +for /f %%i in ('where /r "%localappdata%\programs\python" python 2^>nul') do ( + set "py=%%i" + goto run_sfx +) + +echo Error: Could not find Python interpreter +echo. +echo Please install Python from https://python.org +echo Make sure to check "Add Python to PATH" during installation +echo. +echo Alternatively, you can run this command manually: +echo python "%py_file%" +echo. +pause +exit /b 1 + +:run_sfx +echo Using Python: %py% +echo Setting PRTY_NO_MAGIC=1 to prevent crashes +echo. +echo Starting copyparty... +echo. + +rem Run the Python file with all arguments passed to this batch file +"%py%" "%py_file%" %* + +rem Check exit code +if %errorlevel%==0 ( + echo. + echo copyparty finished successfully +) else ( + echo. + echo copyparty exited with error code %errorlevel% + echo. + echo If you see "Segmentation fault" or similar crashes, this is likely + echo caused by the python-magic library. The SFX file should automatically + echo set PRTY_NO_MAGIC=1 to prevent this on Windows. + echo. + echo For more help, try running: + echo "%py%" "%py_file%" --help + echo. + pause +) + +endlocal diff --git a/contrib/windows/README.md b/contrib/windows/README.md new file mode 100644 index 00000000..e69de29b diff --git a/contrib/windows/copyparty-sfx.bat b/contrib/windows/copyparty-sfx.bat new file mode 100644 index 00000000..e69de29b diff --git a/scripts/sfx.py b/scripts/sfx.py index f1a4682f..2971dcaf 100644 --- a/scripts/sfx.py +++ b/scripts/sfx.py @@ -370,13 +370,40 @@ def get_payload(): def confirm(rv): msg() - msg("retcode", rv if rv else traceback.format_exc()) if WINDOWS: + msg("=" * 72) + if rv == 0: + msg("An unexpected error occurred while running copyparty.") + msg("Error details:", traceback.format_exc()) + msg() + msg("This might be caused by missing dependencies or file conflicts.") + msg() + msg("To debug this issue:") + msg("1. Open Command Prompt (cmd) or PowerShell") + msg("2. Navigate to the folder containing this file") + msg("3. Run: python", os.path.basename(me)) + msg("4. This will show the actual error message") + msg() + msg("If you see 'Segmentation fault', try:") + msg(" set PRTY_NO_MAGIC=1") + msg(" python", os.path.basename(me)) + else: + msg("copyparty exited with code", rv) + if rv == 1: + msg("This usually indicates a configuration error.") + msg("Check your command line arguments and try again.") + msg() + msg("For help, run: python", os.path.basename(me), "--help") + + msg("=" * 72) msg("*** hit enter to exit ***") try: raw_input() if PY2 else input() except: pass + else: + # Non-Windows behavior - just show the exit code and error + msg("retcode", rv if rv else traceback.format_exc()) sys.exit(rv or 1) @@ -439,6 +466,12 @@ def run_s(ld): def main(): + # Set PRTY_NO_MAGIC=1 on Windows to prevent segfaults with python-magic + if platform.system() == "Windows" and "PRTY_NO_MAGIC" not in os.environ: + os.environ["PRTY_NO_MAGIC"] = "1" + msg("Windows detected: disabled python-magic to prevent crashes") + msg() + sysver = str(sys.version).replace("\n", "\n" + " " * 18) pktime = time.strftime("%Y-%m-%d, %H:%M:%S", time.gmtime(STAMP)) msg()