Hi all,

In my last post I mentioned that the qt.conf INI file was key to fixing the "cannot move to target thread" problem, caused by multiple instances of Qt running in the same app. The following setup.py file is my encapsulation of the solution. This is my first brush with py2app, so there may well be some idiosyncrasies in my code. I'll look into contributing a recipe when more of the dust settles.

Thanks
Scott





#-------------------------------------------------------------------------------
# This is a py2app setup.py file, created to build a Qt4 PyQt application # that relies on the PQSQL plugin. Note that the app links to Qt as Frameworks
# and references filenames and directories as installed via macports.
#-------------------------------------------------------------------------------



#-------------------------------------------------------------------------------
# imports
#-------------------------------------------------------------------------------
import sys, os
import subprocess
from setuptools import setup



#-------------------------------------------------------------------------------
# names and dirs
#-------------------------------------------------------------------------------
name         = 'Appname'
APP          = ['Appname.py']
appdir = os.path.abspath(os.path.join("dist", name + ".app", "Contents"))



#-------------------------------------------------------------------------------
# options - setup
#-------------------------------------------------------------------------------
OPTIONS      = {'argv_emulation': True,
                                'includes': ['sip', 'PyQt4._qt'],
                
'excludes': ['PyQt4.QtDesigner', 'PyQt4.QtNetwork', 'PyQt4.QtOpenGL',
                                                         'PyQt4.QtScript', 
'PyQt4.QtTest', 'PyQt4.QtWebKit',
                                                         'PyQt4.QtXml', 
'PyQt4.phonon'],

                                # qt4-mac plugins dir from macports install
'frameworks': ["/opt/local/libexec/qt4-mac/plugins/sqldrivers/ libqsqlpsql.bundle"],
                                }

setup(
    app=APP,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)



#-------------------------------------------------------------------------------
# methods
#-------------------------------------------------------------------------------
# wrap subprocess
def doSubproc(cmd):
        print " ".join(cmd)
        subprocess.call(cmd)



#-------------------------------------------------------------------------------
# plugin location
#-------------------------------------------------------------------------------
# copy plugin to the app bundle's plugins dir.  According to Qt docs:
# application.app/Contents/plugins/ is the default location for loading Qt plugins
if "py2app" in sys.argv:

        # libqsqlpsql belongs in plugins/sqldrivers
        plugin_dir = os.path.join(appdir, "plugins", "sqldrivers")
        os.makedirs(plugin_dir)
doSubproc(["cp", os.path.join(appdir, "Frameworks", "libqsqlpsql.bundle"), plugin_dir])



#-------------------------------------------------------------------------------
# qt.conf INI file
#-------------------------------------------------------------------------------
# create qt.conf INI file.  For more info,
# http://doc.trolltech.com/4.4/qt-conf.html
iniFilename  = os.path.join(appdir, "Resources", "qt.conf")
iniFile      = open(iniFilename, 'w')

try:
        print "writing %s" % iniFilename
        iniFile.write("[Paths]\nqt_plugpath=plugins")
except IOError:
        print "ERROR: %s not written" % iniFilename

iniFile.close()

# for more info on building Qt apps on Mac OSX, including static linking, # linking to Qt as Frameworks, otool, install_name_tool, and dependencies:
# 
http://doc.trolltech.com/4.4/deployment-mac.html#linking-the-application-to-qt-as-frameworks
        



_______________________________________________
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig

Reply via email to