18

I want to generate a single executable file from my python script. For this I use pyinstaller. I had issues with mkl libraries because I use numpy in the script.

I used this hook so solve the issue, it worked fine. But it does not work if I copy the single executable file to another directory and execute it. I guess I have to copy the hook also. But I just want to have one single file that I can use at other computers without copying .dll's or the hook.

I also changed the .spec file as described here and added the necessary files to the binaries-variable. That also works as long as the .dll's are in the provided directory for the binaries-variable , but that won't work when I use the executable on a computer that doesn't have these .dll's.

I tried using the --hidden-import= FILENAME option. This also solves the issue, but just when the .dll's are provided somewhere.

What I'm looking for is a possibility to bundle the .dll's into the single executable file so that I have one file that works independently.

David P
  • 317
  • 2
  • 3
  • 9

4 Answers4

15

When I faced problem described here https://github.com/ContinuumIO/anaconda-issues/issues/443 my workaround was

pyinstaller -F --add-data vcruntime140.dll;. myscript.py

-F - collect into one *.exe file

. - Destination path of dll in exe file

from docs http://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-data-files

Ilya Davydov
  • 521
  • 8
  • 13
2

Add the current project folder to Path, then Create EXE using following command:

pyinstaller --add-binary AutoItX3_x64.dll;. program_name.py

Create folder \dist\program_name\autoit\lib in tge current project folder, and paste AutoItX3_x64.dll in it.

Ivan Aracki
  • 4,861
  • 11
  • 59
  • 73
2

Here is a modified version of Ilya's answer.

pyinstaller --onefile --add-binary ".venv/Lib/site-packages/example_package/example.dll;." myscript.py

It wasn't clear to me when first stumbling into this issue that you must tell PyInstaller exactly where to find the given file (either via relative or absolute path) if it is not already on your PATH.

I have more discussion on how I found exactly which DLL was missing in this answer to a similar question.

I much prefer this solution to manually copying DLLs into the export directory, since single EXE is better for distributing utilities to non-programmers.

wgrant
  • 165
  • 8
1

As the selected answer didn't work for the case of using libportaudio64bit.dll, I put my working solution here.

For me, the working solution is to add _sounddevice_data folder where the .exe file is located then making a portaudio-binaries folder in it and finally putting libportaudio64bit.dll in the recently created folder.

Hope it helps!

Ali Kareshki
  • 71
  • 1
  • 6
  • This really helped me, so thank you very much :). One other thing you might want to add to your answer is that you mustn't use the `--onefile` flag. :) – Ed Ward Apr 10 '20 at 16:04