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
This commit is contained in:
Aditya 2025-07-30 20:55:42 +05:30
parent 1a66ea1043
commit 18ce0be5b5
5 changed files with 171 additions and 1 deletions

View file

@ -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

126
contrib/run-sfx.bat Normal file
View file

@ -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

View file

View file

View file

@ -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()