The current version of PyInstaller (6.5.0) doesn’t play nicely with the boto3 package. Here’s how to fix it.
The Problem
My requirements.txt looks something like this:
boto3==1.20.54
botocore==1.23.54
pyinstaller==6.5.0
I wrap my script using PyInstaller.
pyinstaller -c -y --onefile crawler.py
When I build and run the executable locally it works 100% fine. However, when I build on GitHub Actions (using ubuntu-latest) I get a flurry of error messages (most mentioning either boto3 or botocore) that terminate with
ModuleNotFoundError: No module named 'configparser'
The Solution
The reason for the error is that PyInstaller is failing to detect the dependency on configparser. There are two ways to address this, either on the command line:
pyinstaller -c -y --hidden-import=configparser --onefile crawler.py
or via the .spec file:
a = Analysis(
['crawler.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=['configparser'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
pyz = PYZ(a.pure)