[PySide] cxfreeze and PySide 1.2.0

Joel B. Mohler jmohler at gamry.com
Wed Jul 10 18:36:06 CEST 2013


On 7/9/2013 11:20 AM, John Ehresman wrote:
> On 7/9/13 11:06 AM, Joel B. Mohler wrote:
>> I have tried commenting out the _setupQtDirectories in __init__.py. It
>> then crashes (ala segfault) on the import of QtCore.  I can't think of
>> anything that makes sense explaining that crash since it works fine
>> unfrozen and the normal cxfreeze failure mode is to have some missing
>> dll or module ... not crashes.
>
> It would be nice for someone to try this in a debug build and hopefull 
> identify where it's segfaulting.  Even if it won't work without a 
> qt.conf, it shouldn't segfault.

Aha, this has been an interesting journey to get this all compiled in 
debug.  I have found the problem.

         Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit"));
         Shiboken::AutoDecRef regFunc(PyObject_GetAttrString(atexit, 
"register"));

This C-level module import in qtcore_module_wrapper.cpp imports python 
module atexit, but it fails and so the second line crashes because 
atexit is null.  So, easy fix is to include "--include-modules=atexit" 
in the cxfreeze command line.

So, what is the correct fix?  I think that import in sbkmodule.cpp does 
right to set the PyErr, but the calling code copied above originating 
from typesystem_core_common.xml (I think?) doesn't check PyErr_Occurred 
and I don't know how the error should propagate in the abstract 
conditions of typesystem_core_common.xml.

With that knowledge, then I suggest the following is a cxfreeze friendly 
implementation of __file__ access appropriate in this context:

diff --git a/PySide/_utils.py.in b/PySide/_utils.py.in
index fb2d25e..f82ce65 100644
--- a/PySide/_utils.py.in
+++ b/PySide/_utils.py.in
@@ -84,8 +84,10 @@ if sys.platform == 'win32':
          return path

      def get_pyside_dir():
-        return 
_get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(__file__)))
+        from . import QtCore
+        return 
_get_win32_case_sensitive_name(os.path.abspath(os.path.dirname(QtCore.__file__)))

  else:
      def get_pyside_dir():
-        return os.path.abspath(os.path.dirname(__file__))
+        from . import QtCore
+        return os.path.abspath(os.path.dirname(QtCore.__file__))

I would be happy to hear opinions on these topics.

Joel




More information about the PySide mailing list