Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Recipe PyQt4 API Version
PyQt API version
PyQt4 supports two different APIs: version 1 (default on Python 2) and version 2 (default on Python 3). It is possible to change API at runtime through the
sip.setapi call; a good example is that someone wants to write API v2 code on Python 2 to be future-proof and ready for the migration to Python 3.
Alas, changing API versions does not currently work with PyInstaller, and leads to error messages such as:
ValueError: API 'QString' has already been set to version 1
Workaround for Development version
In the development version of PyInstaller a good workaround is to create a runtime hook file that is executed before the runtime hook
support/rthooks/pyi_rth_qt4plugins.py in PyInstaller, and add the API changing code at the top of your custom runtime hook. Let's name the file
Then add there code:
import sip sip.setapi(u'QDate', 2) sip.setapi(u'QDateTime', 2) sip.setapi(u'QString', 2) sip.setapi(u'QTextStream', 2) sip.setapi(u'QTime', 2) sip.setapi(u'QUrl', 2) sip.setapi(u'QVariant', 2)
Then rebuild your application with the
pyinstaller.py --runtime-hook rthook_pyqt4.py main_script.py
runtime_hooks argument to the Analysis object in your .spec file
a = Analysis(['main_script.py'], pathex=, hiddenimports=, hookspath=None, runtime_hooks=['rthook_pyqt4.py'])
and it should work with PyInstaller.
Workaround for PyInstaller 2.0
Unless the problem is fixed, a good workaround is to edit the file
support/rthooks/pyi_rth_qt4plugins.py in PyInstaller, and add the API changing code at the top of it. Code like in previous section.