Summary
When using PyInstaller's collect_all("arcade") on Windows, the build fails because arcade ships both a VERSION file and an arcade.version submodule. On case-insensitive filesystems (Windows), these collide during the COLLECT phase.
Error
ERROR: Pyinstaller needs to create a directory at 'dist\diana\_internal\arcade\VERSION', but there already exists a file at that path!
PyInstaller tries to bundle:
arcade/VERSION (the data file)
arcade/version/ (the arcade.version submodule directory)
On Windows, VERSION and version resolve to the same path, causing the conflict.
Reproduction
On Windows:
pip install arcade pyinstaller
Create a minimal spec or script that uses collect_all("arcade"):
from PyInstaller.utils.hooks import collect_all
d, b, h = collect_all("arcade")
# Use these in an Analysis/COLLECT - will fail at COLLECT stage
Workaround
Skip collect_all for arcade and manually include only the runtime resources:
shared_datas = [
(".venv/Lib/site-packages/arcade/resources", "arcade/resources"),
]
PyInstaller's automatic import analysis handles arcade's Python modules fine without collect_all.
Suggested fix
Either:
- Rename
VERSION to something that doesn't collide (e.g., _version.txt, or inline the version string into arcade/__init__.py)
- Or rename the
arcade.version submodule (e.g., arcade._version)
This would make arcade compatible with collect_all on Windows, which is the standard PyInstaller mechanism for bundling packages with data files and hidden imports.
Environment
- arcade: latest (installed via pip)
- PyInstaller: latest
- OS: Windows (GitHub Actions
windows-latest)
- Python: 3.14
Summary
When using PyInstaller's
collect_all("arcade")on Windows, the build fails because arcade ships both aVERSIONfile and anarcade.versionsubmodule. On case-insensitive filesystems (Windows), these collide during the COLLECT phase.Error
PyInstaller tries to bundle:
arcade/VERSION(the data file)arcade/version/(thearcade.versionsubmodule directory)On Windows,
VERSIONandversionresolve to the same path, causing the conflict.Reproduction
On Windows:
Create a minimal spec or script that uses
collect_all("arcade"):Workaround
Skip
collect_allfor arcade and manually include only the runtime resources:PyInstaller's automatic import analysis handles arcade's Python modules fine without
collect_all.Suggested fix
Either:
VERSIONto something that doesn't collide (e.g.,_version.txt, or inline the version string intoarcade/__init__.py)arcade.versionsubmodule (e.g.,arcade._version)This would make arcade compatible with
collect_allon Windows, which is the standard PyInstaller mechanism for bundling packages with data files and hidden imports.Environment
windows-latest)