Hi all,

FYI, here is a viscious bug I found: it may appear if you have installed py2exe 0.6.9, pywin32 2.13 and PyQt4 4.3.3 on Python 2.5 (using the official binaries for each of these packages).


Example:

#-------------------------------------------------------------------------------
from PyQt4.QtGui import QApplication, QFileDialog
import sys
STDOUT = sys.stdout

def file_open(parent=None):
   """File open dialog usable inside/outside a PyQt4 application"""
   if QApplication.startingUp():
       QApplication([]) # You have to create a QApplication instance first

   default_dir = "" # Default directory
   sys.stdout = None # Avoid the "Redirecting output to win32trace
                     # remote collector" message from showing in stdout
   filename = QFileDialog.getOpenFileName(parent, "Title", default_dir,
                                          "All files (*.*)")
   sys.stdout = STDOUT
   if filename:
       return unicode(filename)

print file_open()
#-------------------------------------------------------------------------------

Traceback:

Traceback (most recent call last):
 File "boot_com_servers.py", line 21, in <module>
 File "C:\Python25\lib\site-packages\pythoncom.py", line 3, in <module>
   pywintypes.__import_pywin32_system_module__("pythoncom", globals())
File "C:\Python25\lib\site-packages\win32\lib\pywintypes.py", line 111, in __import_pywin32_system_module__
   mod = imp.load_dynamic(modname, found)
ImportError: DLL load failed [...]


So, with this configuration, if you call any of the QFileDialog (PyQt4.QtGui) static methods - i.e. getSaveFileName, getExistingDirectory and so on, an exception will be raised showing a message like "ImportError: DLL load failed [...]". The reason of this ImportError is quite clear: some PyQt4's DLL are loaded at static memory addresses (that's the way the official binaries have been built), so an import order has to be respected, otherwise when importing pywin32's pywintypes25.dll the memory address is already occupied and the module can't be imported. On the contrary, I have no idea (I must confess that as soon as I found a way to avoid this error, I stop looking for answers) why py2exe's "boot_com_servers.py" (see traceback below) is executed when calling these QFileDialog methods, causing the pywin32's pythoncom module to be imported.


Solution:

#-------------------------------------------------------------------------------
try:
# PyQt4 4.3.3 on Windows (static DLLs) with py2exe and pywin32 installed: # -> pythoncom must be imported first, otherwise py2exe's boot_com_servers # will raise an exception ("ImportError: DLL load failed") when calling
   #    any of the QFileDialog static methods (getOpenFileName, ...)
   import pythoncom
except ImportError:
   pass

from PyQt4.QtGui import QApplication, QFileDialog
import sys
STDOUT = sys.stdout

def file_open(parent=None):
   """File open dialog usable inside/outside a PyQt4 application"""
   if QApplication.startingUp():
       QApplication([]) # You have to create a QApplication instance first

   default_dir = "" # Default directory
   sys.stdout = None # Avoid the "Redirecting output to win32trace
                     # remote collector" message from showing in stdout
   filename = QFileDialog.getOpenFileName(parent, "Title", default_dir,
                                          "All files (*.*)")
   sys.stdout = STDOUT
   if filename:
       return unicode(filename)

print file_open()
#-------------------------------------------------------------------------------

Bug fixed! (or at least avoided)

Cheers,
Pierre
_______________________________________________
PyQt mailing list    PyQt@riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to