4

I'm using pyinstaller. In my script there is:

import toml


config = toml.load('config.toml')

I compiled my script with:

pyinstaller main.py --onefile --clean --name myApp

but when I run the executable it gave me: ModuleNotFoundError: No module named 'toml'

So I tried this:

pyinstaller main.py --hidden-import toml --onefile --clean --name myApp

and now pyinstaller says: ERROR: Hidden import 'toml' not found

xendi
  • 2,332
  • 5
  • 40
  • 64

2 Answers2

10

Found the answer. If you are using a virtual environment (Like Pipenv, pyenv, venv) you need to run pyinstaller in the context of that environment. So...

pip install pyinstaller
python -m PyInstaller main.py ....

Also, as mosegui pointed out, you should put your config flags before the file name:

pyinstaller --hidden-import toml --onefile --clean --name myApp main.py

though this was so long ago that I'm not sure if that was actually an issue for me.

These days I use Poetry so once I have a Poetry environment I just poetry shell and/or poetry run pyinstaller .... Anytime you use poetry run <some cmd sequence> it runs whatever your command sequence is in the context of the current virtual environment. I believe pipenv run accomplishes a similar thing but Poetry always works better for me.

xendi
  • 2,332
  • 5
  • 40
  • 64
  • 1
    This was oddly the only solution after 6 hours of searching for a reason why my script would not compile. This should definitely have more upvotes. – eddyizm Dec 10 '19 at 00:09
  • Hey, I am having the same problem, the command that I run was "pyinstaller --hidden-import tensorflow --onefile main.py" but it still says "Hidden import tensorflow not found!" – devios Jun 17 '21 at 23:06
  • re-ordering parameters didn't work for me, still couldn't find the modules – Vidar Jan 05 '23 at 20:14
0

I know this is a very belated answer, but I will just leave an observation here in case someone finds himself/herself in a similar situation:

Even if you have toml installed, pyinstaller will not find the hidden import because you are passing the config flags after your script name, instead of before, so the command executes up until your script name and disregards the rest. Try:

pyinstaller --hidden-import toml --onefile --clean --name myApp main.py

instead of your current:

pyinstaller main.py --hidden-import toml --onefile --clean --name myApp
mosegui
  • 664
  • 6
  • 15