Freezing to EXE File

PyInstaller

When you build an executable with PyInstaller and run it you may get import errors like this one:

ImportError: No module named mido.backends.rtmidi

The reason is that Mido uses import_module() to import the backend modules, while PyInstaller looks for import statements.

The example below uses the default RtMidi backend. Install its dependency in the environment used to run PyInstaller:

python -m pip install "mido[ports-rtmidi]"

The easiest fix is to import the module at the top of the program:

import mido
import mido.backends.rtmidi  # The backend you want to use.
print(mido.get_input_names())

and then run pyinstaller like usual:

$ pyinstaller --onefile midotest.py
$ ./dist/midotest
[u'Midi Through Port-0']

If you don’t want to change the program, you can instead declare the backend module as a hidden import.

bbFreeze, py2exe, cx_Freeze, py2app, etc.

I suspect the same is true for these, but I have not had a chance to try it out yet.

Adding the explicit import statement should always work, though, since Mido backends are just normal Python modules.