The information above covers most normal uses of PyInstaller.However, the variations of Python and third-party libraries areendless and unpredictable.It may happen that when you attempt to bundle your app eitherPyInstaller itself, or your bundled app, terminates with a Python traceback.Then please consider the following actions in sequence, beforeasking for technical help.
Hidden-import=Pillow -hidden-import='PIL' -hidden-import='Pillow' My script uses the following line of code in regards to the PIL module: from PIL import Image, ImageTk Everything works fine in the script, it is only when I use pyinstaller that I have a problem. File 'E: anaconda3 lib site-packages PyInstaller depend imphook.py', line 447, in postgraph self.loadhookmodule File 'E: anaconda3 lib site-packages PyInstaller depend imphook.py', line 412, in loadhookmodule raise ImportErrorWhenRunningHook( PyInstaller.exceptions.ImportErrorWhenRunningHook: Failed to import module PyInstallerhooks.
Recipes and Examples for Specific Problems¶
The PyInstallerFAQ page has work-arounds for some common problems.Code examples for some advanced uses and some commonproblems are available on our PyInstaller Recipes page.Some of the recipes there include:
The -hidden-import lines are needed because PyInstaller attempts to follow the module import graph for a package, but is very easily confused. Datasette dynamically imports a list of default plugins so I had to explicitly list each of those.
- A more sophisticated way of collecting data filesthan the one shown above (Adding Files to the Bundle).
- Bundling a typical Django app.
- A use of a run-time hook to set the PyQt5 API level.
- A workaround for a multiprocessing constraint under Windows.
and others.Many of these Recipes were contributed by users.Please feel free to contribute more recipes!
Finding out What Went Wrong¶
Analysis step runs, it produces error and warning messages.These display after the command line if the
--log-level option allows it.Analysis also puts messages in a warnings filenamed
build/name/warn-name.txt in the
Analysis creates a message when it detects an importand the module it names cannot be found.A message may also be produced when a class or function is declared ina package (an
__init__.py module), and the import specifies
package.name. In this case, the analysis can’t tell if name is supposed torefer to a submodule or package.
The “module not found” messages are not classed as errors becausetypically there are many of them.For example, many standard modulesconditionally import modules for different platforms that may or maynot be present.
All “module not found” messages are written to the
build/name/warn-name.txt file.They are not displayed to standard output because there are many of them.Examine the warning file; often there will be dozens of modules not found,but their absence has no effect.
When you run the bundled app and it terminates with an ImportError,that is the time to examine the warning file.Then see Helping PyInstaller Find Modules below for how to proceed.
Build-Time Dependency Graph¶
On each run PyInstaller writes a cross-referencing file about dependenciesinto the build folder:
build/name/xref-name.html in the
work-path= directory is an HTML file that lists the fullcontents of the import graph, showing which modules are importedby which ones.You can open it in any web browser.Find a module name, then keep clicking the “imported by” linksuntil you find the top-level import that causes that module to be included.
If you specify
--log-level=DEBUG to the
pyinstaller command,PyInstaller additionally generates a GraphViz input file representing thedependency graph.The file is
build/name/graph-name.dot in the
work-path= directory.You can process it with any GraphViz command, e.g. dot,to producea graphical display of the import dependencies.
These files are very large because even the simplest “hello world”Python program ends up including a large number of standard modules.For this reason the graph file is not very useful in this release.
Build-Time Python Errors¶
PyInstaller sometimes terminates by raising a Python exception.In most cases the reason is clear from the exception message,for example “Your system is not supported”, or “Pyinstallerrequires at least Python 3.5”.Others clearly indicate a bug that should be reported.
(WATCH IN HD)a tutorial using Makeupgeek 'Insomnia' pigment was highly requested! I hope you enjoy! Thanks for watching! Xoxo!Makeup geek:http://w. MAC describes it as a reddish taupe brown, and it is a matte finish. I love Taupe for its uniqueness – I can’t say I’ve seen many lipsticks similar to this shade around. It’s one that many skin tones can work with, from fair through to dark, and it makes for the perfect Autumnal lipstick. MAC Taupe is a very warm-toned, medium-dark brown with a matte finish. It is a permanent lipstick that retails for $20.00 and contains 0.1 oz. MAC Taupe Dupes Here are our dupes for MAC Taupe, which is a very warm-toned, medium-dark brown with a matte finish. It is a permanent lipstick that retails for $20.00 and contains 0.1 oz. The MAC Lipstick Taupe comes with the trademark subtle vanilla fragrance and when applied, gives a nice terracotta brown color with slight red undertones unlike many other lipstick which gives beigy nude color that tends to wash out most Indian/Olive skin tones.
One of these errors can be puzzling, however:
IOError('Pythonlibrarynotfound!')PyInstaller needs to bundle the Python library, which is themain part of the Python interpreter, linked as a dynamic load library.The name and location of this file varies depending on the platform in use.Some Python installations do not include a dynamic Python libraryby default (a static-linked one may be present but cannot be used).You may need to install a development package of some kind.Or, the library may exist but is not in a folder where PyInstalleris searching.
The places where PyInstaller looks for the python library aredifferent in different operating systems, but
/usr/libare checked in most systems.If you cannot put the python library there,try setting the correct path in the environment variable
LD_LIBRARY_PATH in GNU/Linux or
DYLD_LIBRARY_PATH in OS X.
Getting Debug Messages¶
--debug=all option (and its choices) provides asignficiant amount of diagnostic information.This can be useful during development of a complex package,or when your app doesn’t seem to be starting,or just to learn how the runtime works.
Normally the debug progress messages go to standard output.If the
--windowed option is used when bundling a Windows app,they are sent to any attached debugger. If you are not using a debugger(or don’t have one), the DebugView the free (beer) tool can be used todisplay such messages. It has to be started before running the bundledapplication.
--windowed Mac OS app they are not displayed.
Consider bundling without
--debug for your production version.Debugging messages require system calls and have an impact on performance.
Getting Python’s Verbose Imports¶
You can build the app with the
--debug=imports option(see Getting Debug Messages above),which will pass the
-v (verbose imports) flagto the embedded Python interpreter.This can be extremely useful.It can be informative even with apps that are apparently working,to make sure that they are getting all imports from the bundle,and not leaking out to the local installed Python.
Python verbose and warning messages always go to standard outputand are not visible when the
--windowed option is used.Remember to not use this for your production version.
Figuring Out Why Your GUI Application Won’t Start¶
If you are using the
--windowed option,your bundled application may fail to start with an error message like
Failedtoexecutescriptmy_gui.In this case, you will want to get more verbose output to find outwhat is going on.
- For Mac OS, you can run your application on the command line,i.e.``./dist/my_gui``in Terminal instead of clicking on
- For Windows, you will need to re-bundle your application without the
--windowedoption.Then you can run the resulting executable from the command line,i.e.:
- For Unix and GNU/Linux there in no
--windowedoption.Anyway, if a your GUI application fails,you can run your application on the command line,i.e.
This should give you the relevant error that is preventing yourapplication from initializing, and you can then move on to otherdebugging steps.
Operation not permitted error¶
If you use the –onefile and it fails to run you program with error like:
This can be caused by wrong permissions for the /tmp directory(e.g. the filesystem is mounted with
A simple way to solve this issue is to set,in the environment variable TMPDIR,a path to a directory in a filesystem mounted without
noexec flags, e.g.:
Helping PyInstaller Find Modules¶
Extending the Path¶
If Analysis recognizes that a module is needed, but cannot find that module,it is often because the script is manipulating
sys.path.The easiest thing to do in this case is to use the
--paths= optionto list all the other places that the script might be searching for imports:
These paths will be noted in the spec file.They will be added to the current
sys.path during analysis.
Listing Hidden Imports¶
If Analysis thinks it has found all the imports,but the app fails with an import error,the problem is a hidden import; that is, an import that is notvisible to the analysis phase.
Hidden imports can occur when the code is using
eval.Hidden imports can also occur when an extension module uses thePython/C API to do an import.When this occurs, Analysis can detect nothing.There will be no warnings, only an ImportError at run-time.
To find these hidden imports,build the app with the
--debug=imports flag(see Getting Python’s Verbose Imports above)and run it.
Once you know what modules are needed, you add the needed modulesto the bundle using the
--hidden-import= command option,or by editing the spec file,or with a hook file (see Understanding PyInstaller Hooks below).
Extending a Package’s
Python allows a script to extend the search path used for importsthrough the
__path__ mechanism.Normally, the
__path__ of an imported module has only one entry,the directory in which the
__init__.py was found.But
__init__.py is free to extend its
__path__ to include other directories.For example, the
win32com.shell.shell module actually resolves to
win32com/win32comext/shell/shell.pyd.This is because
./win32comext to its
__init__.py of an imported moduleis not actually executed during analysis,changes it makes to
__path__ are not seen by PyInstaller.We fix the problem with the same hook mechanism we use for hidden imports,with some additional logic; see Understanding PyInstaller Hooks below.
Note that manipulations of
__path__ hooked in this way apply onlyto the Analysis.At runtime all imports are intercepted and satisfied from within thebundle.
win32com.shell is resolved the sameway as
win32com.__path__knows nothing of
Once in a while, that’s not enough.
Changing Runtime Behavior¶
More bizarre situations can be accomodated with runtime hooks.These are small scripts that manipulate the environment before your main script runs,effectively providing additional top-level code to your script.
There are two ways of providing runtime hooks.You can name them with the option
Second, some runtime hooks are provided.At the end of an analysis,the names in the module list produced by the Analysis phase are looked up in
loader/rthooks.dat in the PyInstaller install folder.This text file is the string representation of aPython dictionary. The key is the module name, and the value is a listof hook-script pathnames.If there is a match, those scripts are included in the bundled appand will be called before your main script starts.
Hooks you name with the option are executedin the order given, and before any installed runtime hooks.If you specify
--runtime-hook=file1.py--runtime-hook=file2.pythen the execution order at runtime will be:
- Code of
- Code of
- Any hook specified for an included module that is foundin
- Your main script.
Hooks called in this way, while they need to be careful of what they import,are free to do almost anything.One reason to write a run-time hook is tooverride some functions or variables from some modules.A good example of this is the Django runtimehook (see
loader/rthooks/pyi_rth_django.py in thePyInstaller folder).Django imports some modules dynamically and it is lookingfor some
.py files are not available in the one-file bundle.We need to override the function
django.core.management.find_commandsin a way that will just return a list of values.The runtime hook does this as follows:
Getting the Latest Version¶
If you have some reason to think you have found a bug in PyInstalleryou can try downloading the latest development version.This version might have fixes or features that are not yet at PyPI.You can download the latest stable version and the latest developmentversion from the PyInstaller Downloads page.
You can also install the latest version of PyInstaller directlyusing pip:
Asking for Help¶
When none of the above suggestions help,do ask for assistance on the PyInstaller Email List.
Pyinstaller Import Modules
Then, if you think it likely that you see a bug in PyInstaller,refer to the How to Report Bugs page.