Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using --onefile with a .spec in PyInstaller

Tags:

I'm "compiling" a program using PyInstaller using a .spec file. I'm using the .spec file because I need to include an extra file in the program. When I try to do PyInstaller --onefile Prog.spec, it still makes a folder in dist with all the files separate instead of making a single file as I'd expect. If I do PyInstaller --onefile Prog.py then it does make a single .exe file in dist, which is what I want. Is there something special I need to do when using a .spec file?

like image 415
TheStrangeQuark Avatar asked Nov 06 '17 18:11

TheStrangeQuark


2 Answers

Use pyi-makespec --onefile yourprogram.py to generate a sample spec file for onefile mode.

https://pyinstaller.readthedocs.io/en/stable/man/pyi-makespec.html


There is no COLLECT call, and the EXE call is different. Example:

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='main',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )
like image 153
Alan L Avatar answered Sep 30 '22 00:09

Alan L


You can add the extra file on the command line instead of editing the spec file:

pyinstaller --onefile --add-data <SRC;DEST or SRC:DEST> yourfile.py

Otherwise, make sure in the spec file there is no collect step:

"In one-file mode, there is no call to COLLECT, and the EXE instance receives all of the scripts, modules and binaries."

https://pyinstaller.readthedocs.io/en/stable/usage.html for more info on command line flags.

This also may offer some insight if problems persist: Bundling data files with PyInstaller (--onefile)

like image 43
The4thIceman Avatar answered Sep 30 '22 00:09

The4thIceman