From 085fa28be78c7cbd673bc689ef01df035a0b9788 Mon Sep 17 00:00:00 2001 From: giovannibajo Date: Sun, 22 Feb 2009 16:53:22 +0000 Subject: [PATCH] Improve PyQt4 import hook to automatically bundle required plugins. git-svn-id: http://svn.pyinstaller.org/trunk@614 8dd32b29-ccff-0310-8a9a-9233e24343b1 --- hooks/hook-PyQt4.QtCore.py | 9 +++++++++ hooks/hook-PyQt4.QtGui.py | 18 ++++++++++++++++++ hooks/hook-PyQt4.QtScript.py | 11 +++++++++++ hooks/hook-PyQt4.QtSql.py | 9 +++++++++ hooks/hookutils.py | 4 ++++ rthooks.dat | 1 + support/rthooks/qt4plugins.py | 10 ++++++++++ 7 files changed, 62 insertions(+) create mode 100644 hooks/hook-PyQt4.QtScript.py create mode 100644 support/rthooks/qt4plugins.py diff --git a/hooks/hook-PyQt4.QtCore.py b/hooks/hook-PyQt4.QtCore.py index 2386e76..92360bc 100644 --- a/hooks/hook-PyQt4.QtCore.py +++ b/hooks/hook-PyQt4.QtCore.py @@ -1,2 +1,11 @@ hiddenimports = ['sip', "PyQt4._qt"] +from hooks.hookutils import qt4_plugins_dir +pdir = qt4_plugins_dir() + +datas = [ + (pdir + "/codecs/*.so", "qt4_plugins/codecs"), + (pdir + "/codecs/*.dll", "qt4_plugins/codecs"), + (pdir + "/codecs/*.dylib", "qt4_plugins/codecs"), +] + diff --git a/hooks/hook-PyQt4.QtGui.py b/hooks/hook-PyQt4.QtGui.py index baab220..e4e20b4 100644 --- a/hooks/hook-PyQt4.QtGui.py +++ b/hooks/hook-PyQt4.QtGui.py @@ -1 +1,19 @@ hiddenimports = ['sip', 'PyQt4.QtCore', 'PyQt4._qt'] + +from hooks.hookutils import qt4_plugins_dir +pdir = qt4_plugins_dir() + +datas = [ + (pdir + "/imageformats/*.so", "qt4_plugins/imageformats"), + (pdir + "/imageformats/*.dll", "qt4_plugins/imageformats"), + (pdir + "/imageformats/*.dylib", "qt4_plugins/imageformats"), + + (pdir + "/iconengines/*.so", "qt4_plugins/iconengines"), + (pdir + "/iconengines/*.dll", "qt4_plugins/iconengines"), + (pdir + "/iconengines/*.dylib", "qt4_plugins/iconengines"), + + (pdir + "/accessible/*.so", "qt4_plugins/accessible"), + (pdir + "/accessible/*.dll", "qt4_plugins/accessible"), + (pdir + "/accessible/*.dylib", "qt4_plugins/accessible"), +] + diff --git a/hooks/hook-PyQt4.QtScript.py b/hooks/hook-PyQt4.QtScript.py new file mode 100644 index 0000000..8d5e24b --- /dev/null +++ b/hooks/hook-PyQt4.QtScript.py @@ -0,0 +1,11 @@ +hiddenimports = ['sip', 'PyQt4.QtCore', 'PyQt4._qt'] + +from hooks.hookutils import qt4_plugins_dir +pdir = qt4_plugins_dir() + +datas = [ + (pdir + "/script/*.so", "qt4_plugins/script"), + (pdir + "/script/*.dll", "qt4_plugins/script"), + (pdir + "/script/*.dylib", "qt4_plugins/script"), +] + diff --git a/hooks/hook-PyQt4.QtSql.py b/hooks/hook-PyQt4.QtSql.py index d0bbcf9..906cd4c 100644 --- a/hooks/hook-PyQt4.QtSql.py +++ b/hooks/hook-PyQt4.QtSql.py @@ -1,2 +1,11 @@ hiddenimports = ['sip', 'PyQt4.QtCore', 'PyQt4.QtGui', 'PyQt4._qt'] +from hooks.hookutils import qt4_plugins_dir +pdir = qt4_plugins_dir() + +datas = [ + (pdir + "/sqldrivers/*.so", "qt4_plugins/sqldrivers"), + (pdir + "/sqldrivers/*.dll", "qt4_plugins/sqldrivers"), + (pdir + "/sqldrivers/*.dylib", "qt4_plugins/sqldrivers"), +] + diff --git a/hooks/hookutils.py b/hooks/hookutils.py index 29cd8c3..fe0041f 100644 --- a/hooks/hookutils.py +++ b/hooks/hookutils.py @@ -20,3 +20,7 @@ def exec_statement(stat): txt = open(fnm, 'r').read()[:-1] os.remove(fnm) return txt + +def qt4_plugins_dir(): + return exec_statement("from PyQt4.QtCore import QLibraryInfo; print QLibraryInfo.location(QLibraryInfo.PluginsPath)") + diff --git a/rthooks.dat b/rthooks.dat index fae6ed1..27d9d15 100644 --- a/rthooks.dat +++ b/rthooks.dat @@ -3,4 +3,5 @@ 'pywintypes': ['support/rthooks/versioneddll.py'], 'win32com': ['support/rthooks/win32comgenpy.py'], 'OpenGL': ['support/rthooks/opengl.py'], + 'PyQt4': ['support/rthooks/qt4plugins.py'], } diff --git a/support/rthooks/qt4plugins.py b/support/rthooks/qt4plugins.py new file mode 100644 index 0000000..9f3c3b2 --- /dev/null +++ b/support/rthooks/qt4plugins.py @@ -0,0 +1,10 @@ +# Qt4 plugins are bundled as data files (see hooks/hook-PyQt4*), +# within a "qt4_plugins" directory. +# We add a runtime hook to tell Qt4 where to find them, +# through an environment variable. +import os +d = "qt4_plugins" +if "_MEIPASS2" in os.environ: + d = os.path.join(os.environ["_MEIPASS2"], d) +os.environ["QT_PLUGIN_PATH"] = d + os.pathsep + os.environ.get("QT_PLUGIN_PATH", "") +